有的App啟動時會出現(xiàn)一段時間的黑屏蜜唾。
這就是俗稱的啟動黑白屏的問題。這期間弄得用戶不知道該干嘛袁余,氛圍比較尷尬(雖然說用戶虐我千百遍咱揍,我待用戶如初戀)
App 啟動時間是什么,從哪里開始 (我們要知道啟動時間是怎么算出來的)
https://segmentfault.com/a/1190000007406875#articleHeader20
啟動定義
當手指點擊:app圖標到加載第一個頁面為止
trace文件分析:http://www.ituring.com.cn/article/273967
啟動類型:http://www.reibang.com/p/c967653a9468
工欲善其事煤裙,必先利其器。想要優(yōu)化 App 的啟動速度且蓬,必須有準確衡量啟動時間的方法,否則優(yōu)化完之后效果怎樣恶阴,自己都不知道豹障,說出去別人也不信服不是。在做 App 啟動時間統(tǒng)計之前血公,當然必須弄明白有哪些啟動類型,每種啟動類型的特點累魔。
通常來說,在安卓中應用的啟動方式分為以下幾種:
1??????? 冷啟動:當啟動應用時籍茧,后臺沒有該應用的進程,這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應用寞冯,這個啟動方式就是冷啟動晚伙。冷啟動因為系統(tǒng)會重新創(chuàng)建一個新的進程分配給它,所以會先創(chuàng)建和初始化 Application 類咆疗,再創(chuàng)建和初始化 MainActivity 類,最后顯示在界面上尝抖。
2? 熱啟動:當啟動應用時毡们,后臺已有該應用的進程(例:按back鍵昧辽、home鍵,應用雖然會退出红氯,但是該應用的進程是依然會保留在后臺,可進入任務列表查看)痢甘,所以在已有進程的情況下茉贡,這種啟動會從已有的進程中來啟動應用,這個方式叫熱啟動块仆。熱啟動因為會從已有的進程中來啟動王暗,所以熱啟動就不會走 Application 這步了,而是直接走 MainActivity俗壹,所以熱啟動的過程不必創(chuàng)建和初始化 Application,因為一個應用從新進程的創(chuàng)建到進程的銷毀头滔,Application 只會初始化一次涎显。
3? 首次啟動:首次啟動嚴格來說也是冷啟動坤检,之所以把首次啟動單獨列出來期吓,一般來說,首次啟動時間會比非首次啟動要久讨勤,首次啟動會做一些系統(tǒng)初始化工作,如緩存目錄的生產(chǎn)谱姓,數(shù)據(jù)庫的建立刨晴,SharedPreference的初始化路翻,如果存在多 dex 和插件的情況下,首次啟動會有一些特殊需要處理的邏輯帚桩,而且對啟動速度有很大的影響嘹黔,所以首次啟動的速度非常重要,畢竟影響用戶對 App 的第一映像儡蔓。
冷啟動時間優(yōu)化
Application是程序的主入口,特別是很多第三方SDK都會需要在Application的onCreate里面做很多初始化操作召锈,不得不說,各種第三方SDK涨岁,都特別喜歡這個『兵家必爭之地』吉嚣,再加上自己的一些庫的初始化,會讓整個Application不堪重負尝哆。
優(yōu)化的方法,無非是通過以下幾個方面:
? ●延遲初始化
? ●后臺任務
? ●界面預加載
減少應用啟動時的耗時
1琐馆、在Application的構造器方法、attachBaseContext()瘦麸、onCreate()方法中不要進行耗時操作的初始化歧胁,一些數(shù)據(jù)預取放在異步線程中,可以采取Callable實現(xiàn)与帆。
2、對于sp的初始化玄糟,因為sp的特性在初始化時候會對數(shù)據(jù)全部讀出來存在內(nèi)存中,所以這個初始化放在主線程中不合適逢并,反而會延遲應用的啟動速度,對于這個還是需要放在異步線程中處理砍聊。
3、對于MainActivity蟹肘,由于在獲取到第一幀前,需要對contentView進行測量布局繪制操作帘腹,盡量減少布局的層次许饿,考慮StubView的延遲加載策略,當然在onCreate陋率、onStart、onResume方法中避免做耗時操作瓦糟。
4.單獨設置啟動頁的theme,style下只包含windowBacground一個屬性如:
然后再啟動頁的onCreate時扯再,還原到主theme芍耘。