問題描述
app啟動時,會出現(xiàn)一會兒的黑屏或者白屏才進入Activity的界面顯示蜓耻,但是有些app卻不會茫舶,比如QQ,微信刹淌,微博等饶氏?
探究原因
當(dāng)打開一個Activity時讥耗,如果這個Activity所屬的應(yīng)用還沒有在運行,系統(tǒng)會為這個Activity所屬的應(yīng)用創(chuàng)建一個進程疹启,但進程的創(chuàng)建與初始化都需要時間古程,在這個動作完成之前系統(tǒng)要做什么呢?如果沒有任何反應(yīng)的話喊崖,如果程序初始化的時間很長挣磨,用戶可能還以為沒有點到相應(yīng)的位置。但此時所啟動的程序還沒初始化完荤懂,既無法顯示程序茁裙,又不能停在原處不做任何動作,怎么辦节仿?這就有了Starting Window的概念晤锥,也可以稱之為Preview Window。
Starting Window就是一個用于在應(yīng)用程序進程創(chuàng)建并初始化成功前顯示的臨時窗口廊宪,擁有的Window Type是TYPE_APPLICATION_STARTING矾瘾。在程序初始化完成前顯示這個窗口,以告知用戶系統(tǒng)已經(jīng)知道了他要打開這個應(yīng)用并做出了響應(yīng)箭启,當(dāng)程序初始化完成后顯示用戶UI并移除這個窗口壕翩。
顯示白屏或者黑屏,是由你的啟動Activity或者Application來決定的傅寡。如果你使用的是Light主題放妈,那么就可能出現(xiàn)白屏;如果你使用的是Black主題赏僧,那么就可能出現(xiàn)黑屏。當(dāng)你設(shè)置Light或者Black主題時扭倾,Starting Window顯示的就是你啟動Activity的android:windowBackground屬性淀零,所以才會出現(xiàn)白屏或者黑屏的情況。
解決方案
通過上述的原因探究膛壹,我們一想“哎呀驾中,尼瑪?shù)模瓉斫鉀Q方案不是TMD很簡單嘛模聋,就是給啟動的activity添加一個指定的主題嘛肩民!”,是的链方,我們的解決方案就是添加一個主題持痰。
第一步 新建一個主題
在styles.xml文件中添加一個主題,我們就叫“SplashTheme”好吧
<style name="SplashTheme" parent="AppTheme">
<!-- 歡迎頁背景引用剛才寫好的 -->
<item name="android:windowBackground">@drawable/splash_lancher</item>
<item name="android:windowFullscreen">true</item>
<!-- <item name="android:windowIsTranslucent">true</item> --> <!-- 透明背景不要了 -->
</style>
第二步 添加一個layer-list
上述主題中我們發(fā)現(xiàn)android:windowBackground
似乎少了點什么祟蚀,對嘛工窍,我們少了個drawable割卖,這個drawable我們可以直接用一個圖片代替,如果你還要加點其他東東患雏,我們當(dāng)然推薦使用layer-list來創(chuàng)建一個drawable的文件了鹏溯,示例如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 設(shè)置整個屏幕背景為白色 -->
<item >
<color android:color="@color/white"/>
</item>
<!-- 中間logo -->
<item >
<bitmap
android:gravity="center"
android:src="@drawable/ic_launcher" />
</item>
<!-- 底部圖表 -->
<item android:bottom="10dp">
<bitmap
android:gravity="bottom|center_horizontal"
android:src="@drawable/copyright" />
</item>
</layer-list>
第三步 在AndroidManifest.xml中調(diào)用主題
在我們的啟動activity中添加如下代碼
<activity
android:name=".activity.SplashActivity"
<--這里是我們添加的主題->
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
然后就大功告成了