当应用的界面需要时间渲染的时候,就会出现上面的白屏和黑屏问题;

问题复现:

开机引导中有用户协议一大串字符,导致打开卡机引导白屏

从上面知道了,就是因为字符串太多了,需要渲染的时间较多,导致白屏了。

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

看起来就是秒开了呢