今天我們來學習Android 冷啓動、熱啓動方面的知識。
一、什麼是冷啓動、熱啓動?
冷啓動:
在啓動應用時,系統中沒有該應用的進程,這時系統會創建一個新的進程分配給該應用;熱啓動:
在啓動應用時,系統中已有該應用的進程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的進程還是保留在後臺);
二、冷啓動、熱啓動的區別
- 冷啓動:系統沒有該應用的進程,需要創建一個新的進程分配給應用,所以會先創建和初始化Application類,再創建和初始化MainActivity類(包括一系列的測量、佈局、繪製),最後顯示在界面上。
- 熱啓動: 從已有的進程中來啓動,不會創建和初始化Application類,直接創建和初始化MainActivity類(包括一系列的測量、佈局、繪製),最後顯示在界面上。
三、冷啓動時間的計算
- API19 之後,系統會出打印日誌輸出啓動的時間;
- 冷啓動時間 = 應用啓動(創建進程) —> 完成視圖的第一次繪製(Activity內容對用戶可見);
四、冷啓動流程
- Zygote進程中fork創建出一個新的進程;
- 創建和初始化Application類、創建MainActivity;
- inflate佈局、當onCreate/onStart/onResume方法都走完;
- contentView的measure/layout/draw顯示在界面上;
總結:
Application構造方法 –> attachBaseContext() –> onCreate() –> Activity構造方法 –> onCreate() –> 配置主題中背景等屬性 –> onStart() –> onResume() –> 測量佈局繪製顯示在界面上。
五、冷啓動的優化
- 減少在Application和第一個Activity的onCreate()方法的工作量;
- 不要讓Application參與業務的操作;
- 不要在Application進行耗時操作;
- 不要以靜態變量的方式在Application中保存數據;
- 減少佈局的複雜性和深度;