解決APP冷啓動白屏/黑屏的問題
本篇文章來自Hansion的博客
原文鏈接
轉載請註明出處 謝謝!
原因
當啓動一個APP時,孵化器zygote進程會創建一個新的進程去運行這個APP。
但創建進程需要一定時間,再創建完成前,界面不會作出反應。此時會給用戶造成一種沒有點擊到APP的錯覺,影響體驗。
爲了改善用戶體驗,Preview Window出現了,它會在創建進程這個期間顯示,讓用戶感覺到APP啓動了
而Preview Window就是白屏/黑屏的原因,
它是黑屏還是白屏,默認取決於第一個啓動的Activity的Theme,如果該Activity沒設置Theme,默認使用Application的Theme
- 黑屏:使用Black系列的主題時,Preview Window就是黑色
@android:style/Theme.Black"
- 白屏:使用Light系列的主題時,Preview Window就是白色
@android:style/Theme.Light"
解決辦法(三種)
1.給Activity設置一個透明背景的主題(不推薦)
給Activity設置一個透明背景:
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
在清單文件中,讓第一個啓動的Activity使用該主題
2.禁用Preview Window(不推薦)
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowDisablePreview">true</item>
</style>
在清單文件中,讓第一個啓動的Activity使用該主題
3.爲Preview Window設置背景圖、新增一個無多餘操作的Activity
新建一個主題,設置windowBackground爲一張圖片
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/boot_page</item>
<item name="android:windowFullscreen">true</item>
</style>
也可以根據需求設置windowBackground爲一個layer-list,在res/drawable下新建一個layer-list,名字隨便取,比如splash.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/boot_page" />
</layer-list>
新建一個Activity,使用該主題,註釋掉 setContentView方法,僅用於跳轉到原本的第一個啓動的Activity
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_first);
startActivity(new Intent(this, SplashActivity.class));
finish();
}
}
不要忘了更改清單文件,讓新增的Activity第一個啓動
本方法最優,在沒有虛擬鍵的手機上堪稱完美。但遇到虛擬鍵,背景圖就會有一次上下竄動。
參考了美團APP,它爲了解決這個問題,去掉了上面自定義主題中的windowFullscreen屬性,也就是說,不會隱藏虛擬按鍵,這也是一種權衡,需要自行選擇。
但是,如果不隱藏虛擬按鍵,有可能會造成背景圖片Y方向上擠壓變形的問題,在背景上,要做一些針對性的優化。
另外,前兩種解決方案基本上是相同的效果,之所以不推薦,是因爲Preview Window的出現本來就是爲了優化用戶體驗而出現的,雖然會帶來白屏/黑屏的問題,但如果去掉Preview Window或者設置其爲透明,那麼違背了創造Preview Window的初衷,所以推薦第三種方案。
本文所針對的是release版本的APP,因爲白屏問題還有一個原因可以引起,就是Android Studio 2.0的新增功能Instant Run引起的,如果使用了該功能,引起了白屏問題,我們不必在意,Instant Run引起的白屏問題在release版本的APP中是不存在的。