在掘金上看到一篇关于欢迎页白屏的问题发现自己的app也有,所以按照作者的方法试了下,确实解决了白屏问题,但是会出现内存上的问题,所以又试了其他方法,在这总结一下。
问题描述:在桌面点击app后出现顺序:白屏–欢迎页–主界面(或者登陆页)
白屏的可能性有:
应用application中做了太多耗时操作
欢迎页Activity耗时太长
应用冷启动和热启动
冷启动表示后台进程中没有这个应用,在桌面上点击app图标时打开app需要创建application,热启动就是后台已经有这个应用了,点开直接初始化MainActivity,不需要重新初始化application
解决方法
所以可以新建项目测试下在不自定义application的情况下,添加一个欢迎页,看看是否有白屏,由启动方式可知,冷启动的时候,白屏是不可避免的,腾讯的产品大多是让用户点击图标后先静止一段时间,这种方式也可以借鉴。热启动是可以优化的。
考虑是不是设置欢迎页布局耗时太长的原因
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
long startTime = System.currentTimeMillis();
setContentView(R.layout.activity_splash);
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
Log.d("SplashActivity", "time:" + time);
1
2
3
4
5
6
7
8
9
10
11
输出:
时间还挺长的,那如何缩短这些时间呢?
使用theme设置背景代替setContentView
在style中定义:
<style name="StartTheme" parent="AppTheme">
<item name="android:windowBackground">@mipmap/splash2</item>
</style>
1
2
3
在activity中配置
<activity android:name=".index.ui.SplashActivity"
android:theme="@style/StartTheme">
</activity>
1
2
3
4
这样在启动的时候确实不会出现白屏了,感觉很不错,但是有个缺点就是,这张splash图片是写在theme中的,图片的内存释放不掉,所以还有待改进,可以使用下一种方法
在activity的onCreate方法的super前给window设置背景
getWindow().getDecorView().setBackgroundResource(R.mipmap.splash2);
1
这种方法也可以
两种方法的对比
第一种通过主题来设置的缺点是使得图片内存不能回收,优点是很好的解决了白屏问题,点开app几乎看不到白,直接显示欢迎页,体验提高了,第二种通过设置window的背景来解决,缺点是还有几毫秒的空白,给人闪屏的感觉,但是这个空白时间确实比最初的白屏时间短。优点是图片资源在splashActivity销毁后可以回收,不会对内存有太大影响。
那有没有既可以不对内存造成影响又不出现类似闪屏的现象的解决方法呢?经过谷歌搜索,找到了一个解决方法,测试过了,暂时没发现问题。
还是使用第二种给window设置背景的方法,但是需要在application的theme下的style标签下添加一个item标签< item name="android:windowIsTranslucent" >true</item>
顾名思义,设置window为透明,需要注意的是设置这个属性后如果有如果原来有切换动画的话,这个动画会消失。
总结:
对比三种解决方案,如果没使用过度动画,则使用第三种,使用了切换动画则使用第二种,,第一种肯定不是最好的,安卓机对内存的要求还是挺高的,内存优化也是一个重要的问题。
参考文章:
http://blog.csdn.net/fancylovejava/article/details/39643449
http://www.jianshu.com/p/33a798ac3298
---------------------
作者:笔绘丹心
来源:CSDN
原文:https://blog.csdn.net/cdhahaha/article/details/56012325
版权声明:本文为博主原创文章,转载请附上博文链接!