相信大家都会有这样的经历,就是新创建的项目运行app后,发现会出现短时间的白屏或黑屏,然后才进入主界面。为什么会出现这样的现象呢?谷歌工程师出于怎样的考虑呢?我们该如何解决呢?基于这样几个问题,开始分析。
一、手机启动流程
当我们点击开机的时候,首先会通过引导芯片启动Linux内核,通过它会创建init进程,然后孵化出Zygote进程。然后Zygote进程孵化出SystemServer进程,初始化JVM虚拟机。然后初始化AMS\PMS等系统服务,最后才看到桌面的Launcher界面。具体得内部实现原理这里不做分析,大家只需要大致了解流程即可。
二、app启动方式
1、冷启动
程序重新开始,系统没有为该app创建进程。一般是在app第一次启动或者应用程序被系统完全清理。
1、热启动
程序依然存在内存中,只是从前台到后台。使用热启动不会走onCreate()方法,所以能够避免重复的布局的加载和渲染。需要注意的是如果程序被系统清理了,使用暖启动需要重新初始化一些对象,防止空指针的出现。
1、暖启动
它包含冷启动和热启动一些列的操作子集,比热启动消耗稍微多一点,它与热启动最大的区别是它必须调用onCreate()方法重新初始化操作,也可以从onCreate()方法保存的实例来获取某些对象的恢复。比如onCreate()方法参数中的Bundle对象,就可以存储一些对象。
三、冷启动流程
- 加载并启动app
- 为app创建一个空白的窗口
- 创建app进程
- 创建主activity
- 加载布局、绘制
由于在启动的过程中需要一系列的耗时操作,所以在冷启动的过程中会为app添加一个空白的窗口,防止用户感觉到明显的卡顿。这也是出现黑白屏的原因,黑白屏的颜色是根据Theme的颜色来定的。
四、黑白屏解决方案
1、方案1
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark"><