Android冷啓動和熱啓動以及冷啓動優化方案

1、什麼是冷啓動和熱啓動

(1)、冷啓動:
當啓動應用時,後臺沒有該應用的進程,這時系統會重新創建一個新的進程分配給該應用,這個啓動方式就是冷啓動,也就是先實例化Application。
(2)、熱啓動:
當啓動應用時,後臺已有該應用的進程(例:按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在後臺,可進入任務列表查看),所以在已有進程的情況下,這種啓動會從已有的進程中來啓動應用,也就是直接從進程中啓動,不需要重新創建Application,這個方式叫熱啓動。

2、啓動的時候白屏/黑屏問題

(1)、引起白屏的原因
白屏或黑屏,具體是哪一個,取決於app的Theme使用的是dark還是light主題

Android Studio 引起的白屏
2.x時代的AS開啓了instant run以後可能會導致白屏,但實際完整的apk包不會出現此問題

冷啓動引起的白屏/黑屏
點擊你app那一刻到系統調用Activity.onCreate()之間的時間段。在這個時間段內,WindowManager會先加載app主題樣式中的windowBackground作爲app的預覽元素,然後再真正去加載activity的layout佈局

暖啓動/熱啓動引起的白屏/黑屏
這點在配置較好,內存空間充足的手機上不是很明顯,但低端手機或者內存吃緊的情況下依舊會出現”閃屏”效果,持續時間很短,一閃而過

3、具體有哪些階段可優化呢?

點擊app以後到初始化Application之間這段時間,系統接管,從Zygote進程中fork創建新進程,GC回收等等一系列操作,和我們app無關

在這裏插入圖片描述
從上圖可以看到,整個冷啓動流程中至少有兩處onCreate,分別是Application和Activity,整個流程都是可控的。所以,onCreate方法做的事情越多,冷啓動消耗的時間越長

4、啓動時間的計算

(1)、Logcat 自動打印
從Android 4.4(API 19)開始,Logcat自動幫我們打印出應用的啓動時間。這個時間從應用啓動(創建進程)開始計算,到完成視圖的第一次繪製(即Activity內容對用戶可見)爲止。

(2)、Activity的reportFullyDrawn()
我們可以在Activity的任意位置調用此方法已打印你想看到的、執行完某個方法的最終時間。它會在Logcat裏打印從apk初始化(和前面Displayed的時間是一樣的)到reportFullyDrawn()方法被調用用了多長時間

5、優化方案

(1)、從啓動流程分析

減少兩處onCreate()中的初始化操作,將部分初始化移動到IntentService中進行

(2)、從用戶體驗分析
將app首頁的按返回鍵響應修改爲響應Home鍵。讓用戶以爲app確實退出了,但是實際上是點了Home鍵。如此一來,下次點擊app圖標的時候,直接喚起,不需要進行初始化操作,主要可以避免再次走閃屏頁。

(3)、首界面加載
利用Google官方文檔推薦的方式,我們將啓動頁界面的主題設置爲SplashTheme。此界面是冷啓動後首先加載的界面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章