
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圖示后誤以為沒有點擊的感覺
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/180831.html
標籤:其他
