關注微信公衆號:程序員小安,精彩文章按期推送。程序員
APP冷啓動比較慢,點擊桌面圖片須要用戶等待好久,體驗較差。shell
冷啓動(Cold start) 場景:冷啓動是指APP在手機啓動後第一次運行,或者APP進程被kill掉後在再次啓動。 可見冷啓動的必要條件是該APP進程不存在,這就意味着系統須要建立進程,APP須要初始化。在這三種啓動方式中,冷啓動耗時最長,對於冷啓動的優化也是最具挑戰的。所以本文重點談論的是對冷啓動相關的優化。 生命週期:Process.start->Application建立->attachBaseContext->onCreate->onStart->onResume->Activity生命週期 啓動速度:在幾種啓動類型中最慢,也是咱們優化啓動速度最大的攔路虎bash
溫啓動(Warm start) 場景:App進程存在,當時Activity可能由於內存不足被回收。這時候啓動App不須要從新建立進程,可是Activity的onCrate仍是須要從新執行的。場景相似打開淘寶逛了一圈而後切到微信去聊天去了,過了半小時再次回到淘寶。這時候淘寶的進程存在,可是Activity可能被回收,這時候只須要從新加載Activity便可。 生命週期:onCreate->onStart->onResume->Activity生命週期 啓動速度:較快微信
熱啓動(Hot start) 場景:App進程存在,而且Activity對象仍然存在內存中沒有被回收。能夠重複避免對象初始化,佈局解析繪製。 場景就相似你打開微信聊了一會天這時候出去看了下日曆 在打開微信 微信這時候啓動就屬於熱啓動。 生命週期:onResume->Activity生命週期 啓動速度:快app
adb shell am start -W [packageName]/[packageName.***Activity]
複製代碼
例如:佈局
adb shell am start -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity
複製代碼
固然爲告終果更加準確,能夠執行屢次取平均值。學習
adb shell am start -S -R 10 -W com.dateyou.test/com.datayou.test.ui.home.PageLoadingActivity
複製代碼
其中-S表示每次啓動前先強行中止,-R表示重複測試次數。每一次的輸出以下所示信息。測試
冷啓動指的是應用程序從進程在系統不存在,到系統建立應用運行進程空間的過程。冷啓動一般會發生在一下兩種狀況: 1)設備啓動以來首次啓動應用程序 2)系統殺死應用程序以後再次啓動應用程序優化
在冷啓動的最開始,系統須要負責作三件事: 1)加載以及啓動app 2)app啓動以後馬上顯示一個空白的預覽窗口 3)建立app進程ui
一旦系統完成建立app進程後,app進程將要接着負責完成下面的工做: 1)建立Application對象 2)建立而且啓動主線程ActivityThread 3)建立啓動第一個Activity 4)Inflating views 5)佈局屏幕 6)執行第一次繪製 一旦app進程完完成了第一次繪製工做,系統進程就會用main activity替換前面顯示的預覽窗口,這個時候,用戶就能夠正式開始與app進行交互了。
1)預覽窗口 爲何啓動時會出現短暫黑屏或白屏的現象?當用戶點擊你的app那一刻到系統調用Activity.onCreate()之間的這個時間段內,WindowManager會先加載app主題樣式中的windowBackground作爲app的預覽元素,而後再真正去加載activity的layout佈局。 很顯然,若是你的application或activity啓動的過程太慢,致使系統的BackgroundWindow沒有及時被替換,就會出現啓動時白屏或黑屏的狀況(取決於你的主題是Dark仍是Light)。 解決辦法:在style中自定義一個主題,在其中放一張背景圖片或者廣告頁,讓用戶先看默認圖。
2)Application OnCrate()優化 1.耗時操做子線程中進行 2.非必要初始化懶加載
3)Activity onCreate()優化 1.耗時操做子線程中進行 2.佈局層次減小
若有錯誤歡迎指出來,一塊兒學習。