你所不知道的Android啟動頁(歡迎介面)

weixin_34402408發表於2017-12-22

序言:今天老大讓我去找UI要一張啟動頁的圖,然後給專案加個啟動頁,放進去之後也沒管那麼多,後來執行專案的時候發現有點瑕疵,來看下圖:

可能有人要問了,這不是挺好的一個歡迎介面嗎?有啥問題,我相信看的仔細的看官會發現啟動之後有一段時間是空白的,即使是很短,讓人看著也不舒服,這時候可能又有人說了,那可能是你在application裡面幹了耗時的事才導致的,話說我一開始也是這樣覺得的,然後我令寫一個demo作測試,發現然而並不關你的application什麼事兒,因為我都沒有application,啟動的時候依然有這樣的問題,然後我就去對比我手機上騰訊公司和其他公司的產品,我發現他們的app大多是在你手指按下桌面圖示的時候,先**"靜止"**一段時間,然後再啟動,而且中間一點白色的間隙也沒有,這是什麼鬼,帶著疑惑,我去百度了一番,發現問題還真有:

後來我才之後,原來有冷熱啟動這一說:

1、冷啟動:當啟動應用時,後臺沒有該應用的程式,這時系統會重新建立一個新的程式分配給該應用,這個啟動方式就是冷啟動。

特點:冷啟動因為系統會重新建立一個新的程式分配給它,所以會先建立和初始化application類,再建立和初始化MainActivity類(包括一系列的測量、佈局、繪製),最後顯示在介面上。

2、熱啟動:當啟動應用時,後臺已有該應用的程式(例:按back鍵、home鍵,應用雖然會退出,但是該應用的程式是依然會保留在後臺,可進入任務列表檢視),所以在已有程式的情況下,這種啟動會從已有的程式中來啟動應用,這個方式叫熱啟動。

特點:熱啟動因為會從已有的程式中來啟動,所以熱啟動就不會走application這步了,而是直接走MainActivity(包括一系列的測量、佈局、繪製),所以熱啟動的過程只需要建立和初始化一個MainActivity就行了,而不必建立和初始化application,因為一個應用從新程式的建立到程式的銷燬,application只會初始化一次。

既然上述問題不是出在application,那麼肯定就是在Activity了,我是這麼想的,然後我就想著是不是SetContentView的時候花了很多時間呢?然後我又測試了一遍:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    long startTime = System.currentTimeMillis();
    setContentView(R.layout.activity_start);
    Log.d(TAG, "time===" + (System.currentTimeMillis() - startTime));
}
複製程式碼

然後列印出來的時間是:

哈,果真是setContentView導致的,那就很好解決了,我們不要setContentView就好了,可能還有人要問了,你不要setContentView你咋載入佈局呢?別急,別忘了還有theme這個好東西啊!我們可以定義一個theme,然後給theme設定背景就好了:

<style name="StartTheme" parent="AppTheme">
    <item name="android:windowBackground">@mipmap/icon_splash</item>
</style>
複製程式碼

好了,大功告成,我們來看看效果:

注:setContentView的內部原理有興趣的同學可以自己去百度看看,看看在哪裡耗時了

相關文章