原因分析
當(dāng)打開一個(gè)Activity時(shí)迂苛,如果這個(gè)Activity所屬的應(yīng)用還沒有在運(yùn)行,系統(tǒng)會(huì)為這個(gè) Activity所屬的應(yīng)用創(chuàng)建一個(gè)進(jìn)程韧衣,但進(jìn)程的創(chuàng)建與初始化都需要時(shí)間迅细,在這個(gè)動(dòng)作完成之前系統(tǒng)要做什么呢癞己?如果沒有任何反應(yīng)的話,如果程序初始化的時(shí)間很長(zhǎng)似将,用戶可能還以為沒有點(diǎn)到相應(yīng)的位置获黔。但此時(shí)所啟動(dòng)的程序還沒初始化完,既無法顯示程序在验,又不能停在原處不做任何動(dòng)作玷氏,怎么辦?這就有了Starting Window的概念腋舌,也可以稱之為Preview Window盏触。
Starting Window就是一個(gè)用于在應(yīng)用程序進(jìn)程創(chuàng)建并初始化成功前顯示的臨時(shí)窗口,擁有的Window Type是TYPE_APPLICATION_STARTING块饺。在程序初始化完成前顯示這個(gè)窗口赞辩,以告知用戶系統(tǒng)已經(jīng)知道了他要打開這個(gè)應(yīng)用并做出了響應(yīng),當(dāng)程序初始化完成后顯示用戶UI并移除這個(gè)窗口授艰。
顯示白屏或者黑屏辨嗽,是由你的啟動(dòng)Activity或者Application來決定的。如果你使用的是Light主題想诅,那么就可能出現(xiàn)白屏召庞;如果你使用的是Black主題,那么就可能出現(xiàn)黑屏来破。當(dāng)你設(shè)置Light或者Black主題時(shí)篮灼,Starting Window顯示的就是你啟動(dòng)Activity的android:windowBackground屬性,所以才會(huì)出現(xiàn)白屏或者黑屏的情況徘禁。
如何解決
首先給一個(gè)最簡(jiǎn)單的方法诅诱,在styles.xml文件中自定義啟動(dòng)頁的theme:
<!--解決啟動(dòng)閃屏的問題-->
<style name="LauncherTheme" parent="AppTheme">
<item name="android:windowNoTitle">true</item> //設(shè)置窗口全屏
<item name="android:windowIsTranslucent">true</item> //設(shè)置窗口半透明
</style>
將啟動(dòng)頁的theme設(shè)置為自定義的theme
<activity android:name=".main.ui.LauncherActivity"
android:theme="@style/LauncherTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
原理:將窗口背景設(shè)置成半透明后,系統(tǒng)將不會(huì)給窗口設(shè)置預(yù)覽界面送朱;但是娘荡,它和MainActivity的顯示是同步,如果在MainActivity啟動(dòng)的時(shí)候驶沼,有過多復(fù)雜的操作炮沐,就會(huì)出現(xiàn)在手機(jī)中點(diǎn)擊了應(yīng)用程序的圖標(biāo)之后,但過兩秒才會(huì)打開應(yīng)用程序不好的卡頓體驗(yàn)效果回怜。
或者大年,參照同樣的道理,只要給窗口設(shè)置了背景色,系統(tǒng)就不會(huì)給窗口設(shè)置預(yù)覽界面翔试;即:
<!--解決啟動(dòng)閃屏的問題-->
<style name="LauncherTheme" parent="AppTheme">
<item name="android:windowBackground">@color/colorAccent</item>//設(shè)置背景色
<item name="android:windowNoTitle">true</item> //設(shè)置窗口全屏
</style>
或者
<!--解決啟動(dòng)閃屏的問題-->
<style name="LauncherTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/img_welcome</item> //設(shè)置背景圖片
<item name="android:windowFullscreen">true</item> //設(shè)置全屏
<item name="android:windowNoTitle">true</item> //設(shè)置窗口全屏
</style>