一、什么是热启动、冷启动
1 冷启动
后台没有该应用的进程,系统会重新创建一个新的进程分配给该应用,先实例化 Application类,再创建Activity
2 热启动
从已有的进程来启动应用,不会重新创建Application类。直接创建Activity,一系列测量、布局、绘制页面。当back或者home键后,应用虽退出,但是应用的进程依然保留在后台
3温启动
系统有应用进程,内存中没有相关activity,如back键退出应用,未清除进程
二、冷启动流程
- Zygote进程中fork创建出一个新的进程
- 创建和初始化Application类
- 创建MainActivity
- inflate布局、onCreate/onStart/onResume
- contentView的measure/layout/draw显示在界面上;
可优化的阶段-减少Application和MainActivity,OnCreate方法做的事情。事情越多,冷启动时间越长。
三、启动时间的计算
命令:adb shell am start -W 包名/xxxActivity 查看应用启动时间
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.xt.compress/com.xt.activity.SplashActivity }
Status: ok
Activity:com.xt.compress/com.xt.activity.SplashActivity
ThisTime: 727
TotalTime: 727
WaitTime: 763
四、优化方案
1、减少两处onCreate初始化的操作,可将部分操作放到IntentService中操作。
2、接收广播,拉起应用:会走application oncreate方法
3、启动页主题用google推荐的SplashTheme 参考:Splash启动界面秒开的正确打开模式 - 简书 (jianshu.com)
4、减少布局的复杂性和深度
小结:
1.冷启动主要耗时:zygote进程为应用fork新进程
2.可通过adb命令查看启动时间
3.通过IntentService初始化操作,减少onCreate方法的事情
4.通过广播拉起应用(温启动)
5.使用SplashTheme 闪屏页优化启动速度