在我们点击Android手机桌面APP图标时,有时候我么会发现,应用并不是直接进入闪屏页或者应用主页面,而是会有一个短暂时间的白屏才能进去。但如果我们点击Back键退出应用,在点击返回的时候却没有白屏或者白屏时间几乎不可见。为什么会出现这种情况呢?这就涉及到Android应用冷热启动的问题。

1.相关概念:

冷启动就是在启动应用前,系统中没有该应用的任何进程信息;

暖启动时针对一些常驻内存中的应用,暖启动过程减少了对象的初始化,布局加载等工作,启动时间会缩短。但启动时,系统仍然会展现一个空白背景,直到第一个Activity的内容替换。

2.过程:

冷启动时,系统主要任务有两件:

(1)开始加载并启动APP;

(2)创建应用进程信息,进入并显示第一个Activity UI。

而我们我看到的白屏就是在第二步,配置进程信息和第一个Activity UI渲染到页面之前所花费的时间。那么我们来分析一下系统创建应用进程后,所要处理的事情;

(1)初始化应用中的对象(比如Application的创建及其onCreate中的工作)

(2)启动主线程;

(3)创建第一个Activity;

(4)加载布局视图(Inflating);

(5)初始化控件在屏幕上的位置(Laying out)

(6)绘制视图(draw)

只有当应用完成第一次绘制,系统当前展现的空白背景才会被Activity的布局视图替换掉。这是用户才能应用进行交互。在这个流程中主要涉及到Application 的onCreate和第一个Activity的onCreate方法,它们均在View绘制展示之前进行处理。所以在应用自定义的Application类中和第一个Activity类中的onCreate方法处理的逻辑越多,冷启动花费的时间就越长。

3.冷启动优化:

(1)减少Application的onCreate和第一个Activity的工作量

(2)不要让Application参与业务操作,像应用中嵌入的一些第三方 SDK,都建议在 Application 中做一些初始化工作,开发人员不妨采取懒加载的形式移除这部分代码,而在真正需要用到第三方 SDK 时再进行初始化,但是这也是一项很艰巨的任务,因为很难准确知晓什么时候会真正用到;

(3)不要在Application进行耗时操作

(4)尽量减少布局的深度

(5)还有一种投机取巧的办法,就是通过android:windowBackground"设置自定义主题背景,这样就给到用户一种很好的视觉过渡效果,其思想就是让用户将白屏页作为App的一部分;