1. 程式人生 > >Android APP啟動時出現白屏或者黑屏怎麼辦?

Android APP啟動時出現白屏或者黑屏怎麼辦?

1、為什麼APP啟動時會出現白屏或者黑屏?

當開啟一個Activity時,如果這個Activity所屬的應用還沒有在執行,系統會為這個Activity所屬的應用建立一個程序,但程序的建立與初始化都需要時間,在這個動作完成之前系統要做什麼呢?如果沒有任何反應的話,如果程式初始化的時間很長,使用者可能還以為沒有點到相應的位置。但此時所啟動的程式還沒初始化完,既無法顯示程式,又不能停在原處不做任何動作,怎麼辦?這就有了Starting Window的概念,也可以稱之為Preview Window。

Starting Window就是一個用於在應用程式程序建立並初始化成功前顯示的臨時視窗,擁有的Window Type是TYPE_APPLICATION_STARTING。在程式初始化完成前顯示這個視窗,以告知使用者系統已經知道了他要開啟這個應用並做出了響應,當程式初始化完成後顯示使用者UI並移除這個視窗。

顯示白屏或者黑屏,是由你的啟動Activity或者Application來決定的。如果你使用的是Light主題,那麼就可能出現白屏;如果你使用的是Black主題,那麼就可能出現黑屏。當你設定Light或者Black主題時,Starting Window顯示的就是你啟動Activity的android:windowBackground屬性,所以才會出現白屏或者黑屏的情況。

2、怎麼解決啟動白屏或者黑屏問題呢?

在style.xml檔案中為啟動的Activity設定主題,設定android:windowBackground屬性為啟動Activity顯示的閃屏圖片,這樣才有APP秒開的效果。設定android:windowFullscreen屬性為true,使閃屏圖片全屏顯示。設定windowNoTitle屬性為true,隱藏Activity的ActionBar顯示。

<!-- 防止歡迎頁白屏或者黑屏,設定圖片 -->
<style name="SplashTheme" parent="AppBaseTheme">
    <item name="android:windowBackground">@drawable/img_welcome</item>
    <item name="android:windowFullscreen">true</item>
    <item name="windowNoTitle">true</item>
    <!--<item name="android:windowIsTranslucent"
>false</item>--> <!--<item name="android:windowDisablePreview">true</item>-->
</style>

然後,在清單檔案AndroidManifest.xml中,為啟動的Activity設定主題SplashTheme。

<activity
    android:name=".ui.WelcomeActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

此外,如果設定android:windowIsTranslucent屬性,表明該視窗是半透明的,這樣也不會出現白屏或者黑屏。但是,它和MainActivity的顯示是同步,如果在MainActivity啟動的時候,有過多複雜的操作,就會出現在手機中點選了應用程式的圖示之後,但過兩秒才會開啟應用程式不好的卡頓體驗效果。

如果設定android:windowDisablePreview屬性,禁用視窗的預覽動畫, 在MainActivity顯示之前,系統永遠不會使用視窗的主題來顯示它的預覽,這也保證了不會出現白屏或者黑屏。但是,與設定android:windowIsTranslucent屬性一樣,如果在MainActivity啟動的時候,有過多複雜的操作,就會出現在手機中點選了應用程式的圖示,但過兩秒才會開啟應用程式不好的卡頓體驗效果。

3、還有沒有其他解決方案?

以上方式可以實現APP秒開,但是我不想顯示一張圖片,那麼你也可以顯示純顏色,或者純顏色加小圖示。

Starting Window顯示純顏色,直接設定android:windowBackground屬性為顏色程式碼:

<item name="android:windowBackground">@color/colorAccent</item>

Starting Window顯示純顏色加圖示,需要在Drawable中定義一個splash.xml檔案:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 背景顏色 -->
    <item android:drawable="@color/green" />
    <item>
        <!-- 圖片 -->
        <bitmap
            android:gravity="center"
            android:src="@drawable/icon_welcome" />
    </item>
</layer-list>
<!-- 防止歡迎頁白屏或者黑屏,設定圖片 -->
<style name="SplashTheme" parent="AppBaseTheme">
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowFullscreen">true</item>
    <item name="windowNoTitle">true</item>
</style>

4、最後

我們可以看見這個方案還是很有用的,以前做的專案經常白屏,終於找到了合適的解決方案了。