Android 避免APP啓動閃黑屏的解決辦法[轉]
https://www.jianshu.com/p/18227fd891f1
轉載,備忘~
2018.03.09 23:50* 字數 800 閱讀 1499評論 0喜歡 0
概述
當系統啓動一個APP時,zygote進程會首先創建一個新的進程去運行這個APP,但是進程的創建是需要時間的,在創建完成之前,界面是呈現假死狀態,因爲用戶會以爲沒有點到APP而再次點擊,這極大的降低用戶體驗,谷歌做出反饋去避免這段迷之尷尬。於是系統根據你的manifest文件設置的主題顏色的不同來展示一個白屏或者黑屏。而這個黑(白)屏正式的稱呼應該是Preview Window,即預覽窗口。所以,下面我們就來聊聊這個問題的解決方案。
解決方案
既然決定解決這個問題,那麼從哪裏入手呢,Android在選擇展示黑屏或者白屏的時候,是根據你設定的主題而不同的,也就是說,雖然你的代碼沒有被執行,你的配置文件卻被提前讀取了,用來作爲展示Preview Window界面的依據。
所以,我們的解決方案的切入口就是整個APP的manifest文件,更確切的說應該是主題配置文件。
方案一 :開歷史倒車
這個方案就是禁止加載Preview Window,具體做法如下:
<style name="APPTheme"
parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowDisablePreview">true</item>
</style>
將APPTheme設定爲啓動的Activity的主題,即可禁止Preview Window,當然,也有人通過把preview window設置爲全透明,也達成了類似的效果。
結果就是,當你點擊APP時,界面會無響應一段時間,然後進入APP。
我個人強烈不推薦這麼做,因爲Android想方設法提升的用戶體驗一下子被你打回解放前。
方案二:自定義Preview Window
具體方法如下:
<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowBackground">@drawable/splash_icon</item>
</style>
同樣將主題設置到啓動的Activity的主題中,windowBackground就是即將展示的preview window。其中splash_icon可以是一整張圖片,網上很多小夥伴也都是這麼做的。其實它也可以是一個能解析出圖片資源的XML文件,好像只有layer-list這種能做得到,因爲它能夠將多個drawable疊加起來展示。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:opacity="opaque">
<item android:drawable="@color/white"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/qq"/>
</item>
</layer-list>
這樣設置之後,當你點擊APP,會立馬進入你配置的界面,然後啓動歡迎頁;
好了,啓動頁做到這個份兒上,應該就可以交貨了,不過還有一個小問題需要大家注意的,那就是我們給Preview Window設置的背景圖如果不做處理,圖片就會一直存在於內存中,所以,當我們進入到歡迎頁的時候,不要忘了把背景圖設置爲空:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//將window的背景圖設置爲空
getWindow().setBackgroundDrawable(null);
super.onCreate(savedInstanceState);
}
需要注意的是有些手機標題欄和狀態欄也會影響這兩圖層的,造成抖動效果,爲了避免這種情況需要這歡迎頁面設置爲如下:
<style name="GuideTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/windowbackground</item>
<item name="android:windowFullscreen">true</item>
<item name="windowNoTitle">true</item>
</style>
到這裏,關於Android啓動頁的相關問題就都講完了。