Android冷启动和热启动以及冷启动优化方案
Android冷启动和热启动以及冷启动优化方案
1、什么是冷启动和热启动
- 冷启动:
当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动,也就是先实例化Application。 - 热启动:
当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,也就是直接从进程中启动,不需要重新创建Application,这个方式叫热启动。
2、启动的时候白屏/黑屏问题
- 引起白屏的原因
白屏或黑屏,具体是哪一个,取决于app的Theme使用的是dark还是light主题Android Studio 引起的白屏2.x时代的AS开启了instant run以后可能会导致白屏,但实际完整的apk包不会出现此问题冷启动引起的白屏/黑屏点击你app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground作为app的预览元素,然后再真正去加载activity的layout布局暖启动/热启动引起的白屏/黑屏
这点在配置较好,内存空间充足的手机上不是很明显,但低端手机或者内存吃紧的情况下依旧会出现”闪屏”效果,持续时间很短,一闪而过
3、具体有哪些阶段可优化呢?
点击app以后到初始化Application之间这段时间,系统接管,从Zygote进程中fork创建新进程,GC回收等等一系列操作,和我们app无关
从上图可以看到,整个冷启动流程中至少有两处onCreate,分别是Application和Activity,整个流程都是可控的。所以,onCreate方法做的事情越多,冷启动消耗的时间越长
4、启动时间的计算
-
Logcat 自动打印
从Android 4.4(API 19)开始,Logcat自动帮我们打印出应用的启动时间。这个时间从应用启动(创建进程)开始计算,到完成视图的第一次绘制(即Activity内容对用户可见)为止。 -
Activity的reportFullyDrawn()
我们可以在Activity的任意位置调用此方法已打印你想看到的、执行完某个方法的最终时间。它会在Logcat里打印从apk初始化(和前面Displayed的时间是一样的)到reportFullyDrawn()方法被调用用了多长时间
5、优化方案
-
从启动流程分析
减少两处onCreate()中的初始化操作,将部分初始化移动到IntentService中进行
-
从用户体验分析
将app首页的按返回键响应修改为响应Home键。让用户以为app确实退出了,但是实际上是点了Home键。如此一来,下次点击app图标的时候,直接唤起,不需要进行初始化操作,主要可以避免再次走闪屏页。 -
首界面加载
利用Google官方文档推荐的方式,我们将启动页界面的主题设置为SplashTheme。此界面是冷启动后首先加载的界面
冷启动:冷启动其实就是电脑启动的一种方式,当电脑切断电源,在关机状态下按下POWER启动计算机。
热启动:在计算机已经开启的状态下,通过菜单,任务管理器,快捷键或键盘重新引导操作。
在APP中:
当用户启动应用程序时,后台没有该应用程序的进程,这时系统会重新给应用程序分配一个进程,这种方法就叫冷启动。
当用户启动应用程序时,后台已经有了该程序的进程(通过,退出,home键退出让应用程序在后台继续执行)当再次点开APP马上能够恢复到上次使用的状态,不需要再回到手机的首页打开应用程序,这个方式就叫热启动。
共同点:
无论是冷启动还是热启动,都要重新上电,检测硬件,将RAM区清零,即所有变量都初始化为0。