1. 程式人生 > >解決Android首次啟動APP時,顯示空白頁或者黑屏時間長的問題

解決Android首次啟動APP時,顯示空白頁或者黑屏時間長的問題

問題描述: 第一次啟動app(冷啟動,如果不明白冷啟動和熱啟動的話,可以百度一下),會出現白屏或者黑屏,而且當代碼量增多的時候,出現的時間很長。這樣的使用者體驗多不好。下面我寫了一個小例子,先模擬一下該問題的效果圖,以及解決問題後的效果圖。處理前有空白頁如圖1,解決後效果如圖2:
圖1
寫的例子很簡單,開啟app,顯示歡迎頁面,兩秒後進入主頁。上面可以明顯看到在啟動app後,出現一個白屏後才顯示歡迎頁圖片。
圖2
這時候啟動app可以看出,沒有了白屏,直接顯示歡迎頁圖片。

解決方案: 之前因為自己對於這個問題的解決方案不是很理解,所以原來寫的這篇部落格,只是闡述了一下對於這個問題的一個觀點。所以今天進行一下修改,下面我先說一種官方解決方案:系統載入一個Activity的時候,首先讀取當前Activity的Theme

,然後根據Theme中的配置來繪製,當Activity載入完畢後,才會替換為真正的介面layout。所以我給歡迎頁面配置一個主題,設定android:windowBackgroud屬性,這個屬性不僅可以配置顏色,還可以配置圖片,我們把歡迎頁的圖片配置給這個屬性。關鍵程式碼如下:
styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!--
Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item>
</style> <style name="AppTheme.NoActionBar"
>
<item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> <!--歡迎頁面主題--> <style name="AppTheme.NoActionBar.FullScreen"> <item name="android:windowFullscreen">true</item> <item name="android:windowBackground">@mipmap/welcome_page</item> </style> <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> </resources>

AndroidManifest中配置歡迎頁WelcomeActivity指定需要載入的style。
AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blueskygrid.test2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">

        </activity>

        <activity android:name=".begin.WelcomeActivity"
            android:theme="@style/AppTheme.NoActionBar.FullScreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

WelcomeActivity.xml

public class WelcomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_welcome);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
                finish();
            }
        }, 2000);
    }
}

這一種解決方案簡單而且效果比較好。上面只是說了怎麼去做,但是並沒有說為什麼這麼做。我在網上搜索一些資料時,發現一篇文章,寫的很好,圖文並茂。這篇文章詳細的說明了為什麼這樣做,並且還列出了很多種處理白屏或者黑屏問題的方案,強烈推薦大家看這篇文章