Android App 啓動頁面黑屏的問題,現象表現爲:Android 開發 App 啓動時若沒有作特殊處理的話,會出現一瞬間的白屏現象。即便啓動頁界面就加載一個佈局,不作其餘耗時處理,貌似也會出現一瞬間的白屏問題。當從桌面 Launcher 的小圖標點擊冷啓動一個 App 的時候,程序須要進行一些基本的初始化操做,例如在Application 或者SplashActivity中作了不少耗時操做,例如初始化第三方SDK等,當手機性能很差,配置不高時,該現象尤爲明顯。android
注意,有些地方也稱黑屏,主要是看給 App 設置的 Style 樣式。異步
2、啓動頁黑屏問題分析ide
爲何存在這個問題?主要在於如下幾點:佈局
1. 當系統啓動一個 App 時,zygote進程會首先建立一個新的進程去運行這個 App,可是進程的建立是須要時間的,在建立完成以前,界面是呈現假死狀態,因而系統根據你的manifest文件設置的主題顏色的不一樣來展現一個白屏或者黑屏。而這個黑(白)屏正式的稱呼應該是Preview Window,即預覽窗口。性能
2. 此問題的現象實際上就是是Activity默認的主題中的android:windowBackground爲白色或者黑色致使的。動畫
3. 啓動順序總結實際爲:App啓動——Preview Window(也稱爲預覽窗口)——啓動頁。spa
Android 在選擇展現黑屏或者白屏的時候,是根據你設定的主題而不一樣的,也就是說,雖然你的代碼沒有被執行,你的配置文件卻被提早讀取了,用來做爲展現Preview Window界面的依據。因此,解決方案的切入口就是整個APP的manifest文件,更確切的說應該是主題配置文件。code
設置配置文件style樣式中的windowBackground這個屬性來顯示一張背景圖還有一個效果就是啓動應用程序會感受很是快,並且與加載MainActivity的contentView是異步的。blog
解決辦法:給當前啓動頁添加一個有背景的style樣式進程
設置style樣式以下:
<style name="SplashTheme" parent="AppTheme"> <item name="android:windowBackground">@mipmap/splash</item> <item name="android:statusBarColor" tools:ignore="NewApi">@color/white</item> <item name="android:windowIsTranslucent">true</item> </style>
注意,在清單文件中:
<activity android:name=".SplashActivity" android:theme="@style/SplashTheme"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
通過處理以後App啓動時就不會出現一瞬間白屏的效果:
將主題設置到啓動的Activity的主題中,windowBackground就是即將展現的preview window。其中splash能夠是一整張圖片,它也能夠是一個能解析出圖片資源的XML文件。
該方案注意要點:給Preview Window設置的背景圖若是不作處理,圖片就會一直存在於內存中,因此,當咱們進入到歡迎頁的時候,不要忘了把背景圖設置爲空:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//將window的背景圖設置爲空
getWindow().setBackgroundDrawable(null);
super.onCreate(savedInstanceState);
}
這樣操做如何屏幕適配呢? 答:這樣經過樣式style設置SplashActivity加載圖,不能像imageView那樣能夠設置縮放功能,所以能夠採用.9圖片。
禁止加載Preview Window,具體作法以下:
<style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowDisablePreview">true</item> </style>
設定爲啓動的Activity的主題,便可禁止Preview Window,固然,也有人經過把preview window設置爲全透明,也達成了相似的效果。
windowDisablePreview的做用:經過設置android:windowDisablePreview屬性,禁用窗口的預覽動畫,在SplashActivity顯示以前,系統永遠不會使用窗口的主題來顯示它的預覽,這也保證了不會出現白屏或者黑屏。可是,與設置android:windowIsTranslucent屬性同樣,若是在SplashActivity啓動的時候,有過多複雜的操做,就會出如今手機中點擊了應用程序的圖標,但過n秒纔會打開應用程序很差的卡頓體驗效果。
該方案是否有缺點?有,點擊後短暫的那幾百毫秒沒有反應,就好像「假死」了同樣,過了一下子才跳出咱們應用程序的第一個Activity。