一:安卓中应用程序的启动方式有两种:
冷启动:后台没有该应用进程,系统会重新创建一个进程分配给该应用(所以会先创建和初始化Application类,再创建和初始化MainActivity,包括测量,布局,绘制等)
热启动:该应用的进程会保留在后台,在任务列表可以查看(back,home键按下后)(直接创建和初始化MainActivity,包括测量,布局,绘制等)
一个应用从新进程的创建到进程的销毁,只会初始化一次Application.
应用的启动时间:从点击图标到看到界面的第一帧。
二:
可以通过adb shell命令测量:adb shell am start -W [packageName]/[packageName.MainActivity]
这样可以得到三个时间:
this time:类totaltime,除非启动时开了一个透明的activity预先处理一些事再显示出主activity
total time:创建进程,application初始化,activity初始化到显示界面。
wait time:包括系统影响的耗时
三:
总的来说,冷启动过程如下:
点击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的构造器方法、attachBaseContext()、onCreate()中不要进行耗时的初始化,一些数据的预取放在异步线程中,可采取Callable实现;
2:sp的初始化 放在异步线程中处理;
3:对于mainActivity,因为在获取道第一帧前,需要对contentView测量,布局,绘制;因此,尽量减少布局的层次,在生命周期的几个函数里避免做耗时操作。
总的来说,原则就是:避免一些耗时的操作在主线程中。