概述
當系統(tǒng)啟動一個APP時,zygote進程會首先創(chuàng)建一個新的進程去運行這個APP挟憔,但是進程的創(chuàng)建是需要時間的,在創(chuàng)建完成之前烟号,界面是呈現(xiàn)假死狀態(tài)绊谭,因為用戶會以為沒有點到APP而再次點擊,這極大的降低用戶體驗汪拥,谷歌做出反饋去避免這段迷之尷尬达传。于是系統(tǒng)根據(jù)你的manifest文件設(shè)置的主題顏色的不同來展示一個白屏或者黑屏。而這個黑(白)屏正式的稱呼應(yīng)該是Preview Window,即預(yù)覽窗口迫筑。所以宪赶,下面我們就來聊聊這個問題的解決方案。
解決方案
既然決定解決這個問題脯燃,那么從哪里入手呢搂妻,Android在選擇展示黑屏或者白屏的時候,是根據(jù)你設(shè)定的主題而不同的辕棚,也就是說欲主,雖然你的代碼沒有被執(zhí)行邓厕,你的配置文件卻被提前讀取了,用來作為展示Preview Window界面的依據(jù)扁瓢。
所以详恼,我們的解決方案的切入口就是整個APP的manifest文件,更確切的說應(yīng)該是主題配置文件引几。
方案一 :開歷史倒車
這個方案就是禁止加載Preview Window单雾,具體做法如下:
<style name="APPTheme"
parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowDisablePreview">true</item>
</style>
將APPTheme設(shè)定為啟動的Activity的主題,即可禁止Preview Window她紫,當然硅堆,也有人通過把preview window設(shè)置為全透明,也達成了類似的效果贿讹。
結(jié)果就是渐逃,當你點擊APP時,界面會無響應(yīng)一段時間民褂,然后進入APP茄菊。
我個人強烈不推薦這么做,因為Android想方設(shè)法提升的用戶體驗一下子被你打回解放前赊堪。
方案二:自定義Preview Window
具體方法如下:
<style name="APPTheme" parent="@android:style/Theme.Holo.NoActionBar">
<item name="android:windowBackground">@drawable/splash_icon</item>
</style>
同樣將主題設(shè)置到啟動的Activity的主題中面殖,windowBackground就是即將展示的preview window。其中splash_icon可以是一整張圖片哭廉,網(wǎng)上很多小伙伴也都是這么做的脊僚。其實它也可以是一個能解析出圖片資源的XML文件,好像只有l(wèi)ayer-list這種能做得到,因為它能夠?qū)⒍鄠€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>
這樣設(shè)置之后辽幌,當你點擊APP,會立馬進入你配置的界面椿访,然后啟動歡迎頁乌企;
好了,啟動頁做到這個份兒上成玫,應(yīng)該就可以交貨了加酵,不過還有一個小問題需要大家注意的,那就是我們給Preview Window設(shè)置的背景圖如果不做處理哭当,圖片就會一直存在于內(nèi)存中猪腕,所以,當我們進入到歡迎頁的時候荣病,不要忘了把背景圖設(shè)置為空:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//將window的背景圖設(shè)置為空
getWindow().setBackgroundDrawable(null);
super.onCreate(savedInstanceState);
}
需要注意的是有些手機標題欄和狀態(tài)欄也會影響這兩圖層的码撰,造成抖動效果,為了避免這種情況需要這歡迎頁面設(shè)置為如下:
<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>
到這里个盆,關(guān)于Android啟動頁的相關(guān)問題就都講完了脖岛。