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啓動速度。