一、应用启动方式
1、冷启动:当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。
2、热启动:应用启动过后,后台还保留了应用的进程,这种启动应用方式叫热启动。
二、应用启动流程
在安卓系统上,应用在没有进程的情况下,应用的启动都是这样一个流程:当点击app的启动图标时,安卓系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,所以直到这里,应用的第一次启动才算完成,这时候我们看到的界面也就是所说的第一帧。
即:Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。
三、计算冷启动时间
1、在application中添加下面代码,记录好开始时间
public class MyApplication extends Application {
private final String TAG = "MyApplication";
public static long startTime ;
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG,"startTime="+System.currentTimeMillis());
startTime = System.currentTimeMillis();
2、在MainActivity中的onResume()中打印出启动时间。
Log.e(TAG,"startTime="+(System.currentTimeMillis()-startTime));
3、可以使用adb shell命令测量启动时间,执行成功后将返回三个测量到的时间。
adb shell am start -W [packageName]/[packageName.MainActivity]
ThisTime:一般和TotalTime时间一样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小
TotalTime:应用的启动时间,包括创建进程+Application初始化+Activity初始化到界面显示。
WaitTime:一般比TotalTime大点,包括系统影响的耗时。
四、优化用户体验
1、可以在styles.xml的AppTheme中添加下面代码,就是将窗口设置成透明,让用户看不到白屏。
true
true
五、减少启动时间
1、在application中不要进行太多的耗时操作,除非必须的,现在很多第三方的框架都需要在application中初始化,导致开机时间变得很长,开机慢大部分原因在此。
2、对于sp的初始化,因为sp的特性在初始化的时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个最好放在异步线程中处理。
3、对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中避免做耗时操作。