1、应用的启动html
启动方式java
一般来讲,在安卓中应用的启动方式分为两种:冷启动和热启动。shell
特色app
一、冷启动:冷启动由于系统会从新建立一个新的进程分配给它,因此会先建立和初始化Application类,再建立和初始化MainActivity类(包括一系列的测量、布局、绘制),最后显示在界面上。异步
二、热启动:热启动由于会从已有的进程中来启动,因此热启动就不会走Application这步了,而是直接走MainActivity(包括一系列的测量、布局、绘制),因此热启动的过程只须要建立和初始化一个MainActivity就好了,而没必要建立和初始化Application,由于一个应用重新进程的建立到进程的销毁,Application只会初始化一次。布局
上面说的启动是点击app的启动图标来启动的,而另一种方式是进入最近使用的列表界面来启动应用,这种不该该叫启动,应该叫恢复。spa
2、应用启动的流程.net
在安卓系统上,应用在没有进程的状况下,应用的启动都是这样一个流程:当点击app的启动图标时,安卓系统会从Zygote进程中fork建立出一个新的进程分配给该应用,以后会依次建立和初始化Application类、建立MainActivity类、加载主题样式Theme中的windowBackground等属性设置给MainActivity以及配置Activity层级上的一些属性、再inflate布局、当onCreate/onStart/onResume方法都走完了后最后才进行contentView的measure/layout/draw显示在界面上,因此直到这里,应用的第一次启动才算完成,这时候咱们看到的界面也就是所说的第一帧。线程
因此,总结一下,应用的启动流程以下:code
Application的构造器方法——>attachBaseContext()——>onCreate()——>Activity的构造方法——>onCreate()——>配置主题中背景等属性——>onStart()——>onResume()——>测量布局绘制显示在界面上。
3、测量应用启动的时间
在上面这个启动流程中,任何一个地方有耗时操做都会拖慢咱们应用的启动速度,而应用启动时间是用毫秒度量的,对于毫秒级别的快慢度量咱们仍是须要去精确的测量到到底应用启动花了多少时间,而根据这个时间来作衡量。
什么才是应用的启动时间
从点击应用的启动图标开始建立出一个新的进程直到咱们看到了界面的第一帧,这段时间就是应用的启动时间。
咱们要测量的也就是这段时间,测量这段时间能够经过adb shell命令的方式进行测量,这种方法测量的最为精确,命令为:
执行成功后将返回三个测量到的时间:
一、ThisTime:通常和TotalTime时间同样,除非在应用启动时开了一个透明的Activity预先处理一些事再显示出主Activity,这样将比TotalTime小。
二、TotalTime:应用的启动时间,包括建立进程+Application初始化+Activity初始化到界面显示。
三、WaitTime:通常比TotalTime大点,包括系统影响的耗时。
下面是测量一个应用冷启动和热启动的时间:
冷启动:
热启动:
能够看到在进程已经存在的状况下,只须要从新初始化MainActivity,这样的启动比较快,不过大多数状况下应用的启动都是冷启动,由于用户都会在任务列表中手动关闭遗留的应用进程。
4、减小应用启动时的耗时
针对冷启动时候的一些耗时,如上测得这个应用算是中型的app,在冷启动的时候耗时已经快700ms了,若是项目再大点在Application中配置了更多的初始化操做,这样将可能达到1s,这样每次启动都明显感受延迟,因此在进行应用初始化的时候采起如下策略:
遵循上面三种策略可明显提升app启动速度。