当应用的界面需要时间渲染的时候,就会出现上面的白屏和黑屏问题;
问题复现:
开机引导中有用户协议一大串字符,导致打开卡机引导白屏
从上面知道了,就是因为字符串太多了,需要渲染的时间较多,导致白屏了。
StartingWindow 惹的锅
从 Android 的绘制流程我们知道,都是 先绘制背景再绘制内容 的。
但是,从Activity 的onCreate 中 setContentVeiw(),设置了布局,那么它就应该显示我们的布局了啊,怎么还会出现上面这种情况呢?原因如下:
当我们打开一个应用的时候,Android 会检测 Activity 所属的 application ,如果该 application 进程还没有创建,则系统会先创建 application ,这也是 application 比 activity早的原因。而 进程的创建是需要时间的,且创建之后, setContentView 的渲染也需要一定的时间,如果内存较低,或者view 的过于复杂,旋绕时间就比较长了;总的来说,就是进程的创建和初始化完成需要时间,如果这个时间比较久,就会出现上诉的情况。
那怎么办,进程都起来,总得让用户知道把,于是 就有了 startWindow 这个 window ,实际上它是一个准备过程,所以,当进程初始化完毕,UI渲染完成,它就会被移除,才会显示我们设计好的 View。而 startWindow 这个 window 就是白屏,黑屏罪魁祸首了。
那白屏,黑屏又是怎么来的呢?
当 startWindow 启动的时候,没有什么UI ,其实就是背景,当你的 theme 选择是 Theme.AppCompat.Light 的时候,它就是白屏,当你选择是 Theme.AppCompat.DayNight 的时候,它就是黑屏了。
知道了原理,就是我们只需要把背景设置成透明的,就没有这个问题了,如下,设置主题的背景色:
true
true
...
加上,解决问题
闪屏
由于背景是透明的,当从 开机引导进入 launcher 的时候,还发现了 闪屏的问题,想了想,其实加一个退出动画就可以了,由于 activity 是 window 级别的,所以,style 如下:
true
true
...
@android:anim/fade_in
@android:anim/fade_out
秒开应用思路
从上面知道白屏和黑屏的出现过程,把背景设置成透明就解决了,那就是每个应用再进入的时候,通常都会有个 SplashActivity,只要把它的背景设置成一张图片,然后再 style 里面设置:
@mipmap/splash
看起来就是秒开了呢