两种启动方式

在Android系统中有两种启动方式分别为冷启动和热启动,定义如下:

  • 冷启动:冷启动就是通过点击桌面图标启动应用,这种启动方式由于后台没有该应用的进程,系统会从Zygote进程中fork创建出一个新的进程分配给该应用,之后会依次创建和初始化Application类、创建MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上。
    整个过程如下所示:
Application构造 ——> attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。
  • 热启动:当启动应用时,后台已有该应用的进程,所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这种方式叫热启动。热启动因为会从已有的进程中来启动,所以热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),所以热启动的过程只需要创建和初始化一个MainActivity就行了,而不必创建和初始化Application,因为一个应用从新进程的创建到进程的销毁,Application只会初始化一次。

启动时间和启动时间的测量

启动时间指的是从点击应用的启动图标开始直到我们看到了界面的第一帧,这段时间就是应用的启动时间。应用启动时间可以通过如下方式进行测量:

adb shell am start -W [packageName]/[packageName.MainActivity]

减小应用启动时间的方法

  • 在Application的onCreate()方法中不要进行耗时操作的初始化,尽量将耗时间操作放在后台线程异步处理。
  • 对于MainActivity,由于在获取到第一帧前,需要对布局进行测量绘制操作所以尽量减少布局的层次,以及采用ViewStab延迟加载策略,并在onCreate、onStart、onResume方法中避免做耗时操作。
  • 由于在冷启动时刻,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载activity的layout布局,所以可以通过给windowBackground设置一个图片在视觉上来骗过用户

推荐使用如下的解决方案,我这边尝试了下还是有效果的,但是如果本身应用在这段时间如果就没处理什么事情,就比较难看出这个效果了:
https://github.com/DreaminginCodeZH/MaterialColdStart

英文不好的可以看下下面这篇博客:
http://blog.csdn.net/ccsutofly/article/details/49990939

Contents
  1. 1. 两种启动方式
  2. 2. 启动时间和启动时间的测量
  3. 3. 减小应用启动时间的方法