每日一言:没有热忱,世间便无进步。
欢迎一起讨论和学习,QQ:732258496 QQ群:478720016
一.抛出问题
关于android app启动页白屏黑屏和手机启动页图片跳跃闪屏的问题。
二.产生原因
-
白屏或黑屏,具体是哪一个,取决于
app的Theme使用的是dark还是light主题 -
Android Studio 引起的白屏
2.x时代的AS开启了instant run以后可能会导致白屏,但实际完整的apk包不会出现此问题 -
冷启动引起的白屏/黑屏
点击你
app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground作为app的预览元素,然后再真正去加载activity的layout布局 -
暖启动/热启动引起的白屏/黑屏
这点在配置较好,内存空间充足的手机上不是很明显,但低端手机或者内存吃紧的情况下依旧会出现”闪屏”效果,持续时间很短,一闪而过
三.最优解决发方式(经多种方法对比得出)
关键代码:<item name="android:windowFullscreen">true</item>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="android:listDivider">@drawable/divider</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/back</item>
<item name="colorAccent">@color/title_back_color</item>
<item name="android:windowFullscreen">true</item>
</style>
<!--parent设置为启动页的theme-->
<style name="AppTheme.customTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/iv_lead_page</item>
</style>
<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/icon"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme.customTheme">
四.APP启动优化汇总
1.启动方式
(1) 冷启动:当启动应用时,后台没有该应用的进程(常见如:进程被杀、首次启动等),这时系统会重新创建一个新的进程分配给该应用
(2) 暖启动:当启动应用时,后台已有该应用的进程(常见如:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用
(3) 热启动:相比暖启动,热启动时应用做的工作更少,启动时间更短。热启动产生的场景很多,常见如:用户使用返回键退出应用,然后马上又重新启动应用
热启动和暖启动因为会从已有的进程中来启动,不会再创建和初始化Application
2.优化
我将冷启动优化分为可控阶段和不可控阶段
-
不可控阶段
点击
app以后到初始化Application之间这段时间,系统接管,从Zygote进程中fork创建新进程,GC回收等等一系列操作,和我们app无关 -
可控阶段
初始化
Application开始,如下图
从上图可以看到,整个冷启动流程中至少有两处
onCreate,分别是Application和Activity,整个流程都是可控的。所以,onCreate方法做的事情越多,冷启动消耗的时间越长
3.优化方案(仅针对可控范围)
-
从启动流程分析
减少两处
onCreate()中的初始化操作,将部分初始化移动到IntentService中进行 -
从用户体验分析
将
app首页的按返回键响应修改为响应Home键,曲线救国。让用户以为app确实退出了,但是实际上是点了Home键。如此一来,下次点击app图标的时候,直接唤起,不需要进行初始化操作,主要可以避免再次走闪屏页,参考美团,微信,QQ,淘宝等(实现的效果一样,但是实现方式就不得而知了)- 微博:启动后点击返回键和
Home键的操作一样,底部选中tab没有做自切换 - 美团:启动后点击返回键和
Home键的操作不一样,底部选中tab做了自切换 - QQ:同微博
- 淘宝:启动后在首页按返回键,会先回到第一个
tab,然后再退出
- 微博:启动后点击返回键和
4.总结
- 白屏/黑屏界面使用图片替换
onCreate中尽量避免做过多的初始化动作,如果必须,那么考虑IntentService- 首页中对
Back和Home键的动作做一些假象,使用户按Back键时以为他退出了,以减少下次启动的不必要动作(建议:非即时消息类和社交类app,这种做法慎用,因为可能有流氓之嫌。。。(逃)) Activity#moveTaskToBack(true)
1866

被折叠的 条评论
为什么被折叠?



