Android效能優化—App啟動速度優化

2020-10-19 22:00:42

在這裡插入圖片描述

app啟動的白屏黑畫面

開發中會在Activity的onCreate()方法中呼叫setContentView(View)設定該Activity的佈局,那麼問題就來了,既然我們設定了佈局,為什麼啟動的時候還會白屏或者黑畫面而不是顯示set的佈局呢?下面就一起來剖析一下原因。
當開啟一個Activity時,如果這個Activity所屬的Application還沒有在執行,系統會為這個Activity的建立一個程序(每開啟一個程序都會有一個Application,所以Application的onCreate()可能會被呼叫多次,一個程序呼叫一次),但程序的建立與初始化都需要時間,在這個動作完成之前,如果初始化的時間過長,螢幕上可能沒有任何動靜,使用者會以為沒有點到按鈕。所以既不能停在原來的地方又沒到顯示新的介面,怎麼辦呢?這就有了StartingWindow(也稱之為PreviewWindow)的出現,這樣看起來就像Activity已經啟動起來了,只是資料內容還沒有初始化好。
原始碼:
啟動根Activity時:ActivityStack#startActivityLocked -> showStartingWindow

StartingWindow一般出現在應用程式程序建立並初始化成功前,所以它是個臨時視窗,對應的WindowType是TYPE_APPLICATION_STARTING。目的是告訴使用者,系統已經接受到操作,正在響應,在程式初始化完成後實現目的UI,同時移除這個視窗。

這個StartingWindow就是白屏黑畫面的根本原因,一般情況下開發者會對Application和Activity設定Theme,系統會根據設定的Theme初始化StartingWindow。Window裡面的頂層是DecorView,StartingWindow顯示一個空DecorView,但是會給這個DecorView應用這個Activity指定的Theme,如果這個Activity沒有指定Theme就用Application的(Application是系統要求必須設定Theme)。

在Theme中可以指定視窗的背景,Activity的ICON,APP整體文字顏色等,如果說沒有指定任何屬性,就會用預設的屬性,也就是上文中提到的空DecorView,所以我們的白屏和黑畫面和空DecorView息息相關,我們給APP設定的Style就決定了是白屏還是黑畫面。

1、如果選擇了Black的系列的主題那麼Activity跳轉的時候就是黑畫面:

@android:style/Theme.Black"

2、如果選擇了Light的系列的主題那麼Activity跳轉的時候就是白屏:

@android:style/Theme.Light"

解決辦法

方法1.設定背景圖Theme
通過設定一張背景圖。 當程式啟動時,首先顯示這張背景圖,避免出現黑畫面

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="android:screenOrientation">portrait</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">>@mipmap/splash</item>
        <item name="android:windowIsTranslucent">true</item>        
</style>

方法2.設定透明Theme
通過把樣式設定為透明,程式啟動後不會黑畫面而是整個透明瞭,等到介面初始化完才一次性顯示出來

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  		<item name="android:screenOrientation">portrait</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>      
</style>

兩者對比:
第一種:程式啟動快,介面先顯示背景圖,然後再重新整理其他介面控制元件。但如果背景圖和要顯示的頁面風格區別大的話會給使用者重新整理不同步感覺。
第二種:使用者點選我們APP圖示後,需要等待2秒左右的時候才會顯示contentView。給使用者一種APP啟動速度慢的假象,其實Activity已經啟動了,只是background是透明的,這時候你點選桌面的其他地方是無效的。

方法3.去除PreviewWindow

    <style name="AppStarTheme" parent="AppTheme">
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@null</item>
        <item name="android:windowDisablePreview">true</item>
    </style>

會造成使用者點選桌面上的app圖示後誤以為沒有點選的感覺