解決APP冷啓動白屏/黑屏的問題

解決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中是不存在的。


參考:
帶你重新認識:Android Splash頁秒開 Activity白屏 Activity黑屏

發佈了64 篇原創文章 · 獲贊 90 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章