1. 程式人生 > >關於android app啟動頁白屏黑屏和華為手機啟動頁圖片跳躍閃屏的問題

關於android app啟動頁白屏黑屏和華為手機啟動頁圖片跳躍閃屏的問題

1、產生原因   

        關於點選app圖標出現白屏和黑屏的產生原因,首先要說的就是app的啟動模式:冷啟動(cold start),暖啟動(warm start),熱啟動(lukewarm start)。

  • 冷啟動:是指程序從無到有的過程。因為要進行頁面初始化,所以相對其他兩個啟動方式,消耗的時間是相對比較多的。
  • 熱啟動:是指之前的程序還在,在之前程序的基礎上建立 Activity 的過程。

        我們遇到的白屏黑屏問題就是在app的冷啟動時期產生的,一般就是app從後臺移除再點選進入的時候。因為在app冷啟動的時候需要做一些了初始化操作application、LAUNCHER。在一些列初始化的時間裡系統為通知使用者已進入app會彈出一個預載入頁面告訴app已經啟動。如果未做任何處理就會出現白屏和黑屏的現象。

2、解決方式

解決方式主要是對啟動頁Theme的處理

<activity
android:name=".LogoActivity"
android:theme="@style/StartTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity
>

(1)隱藏預載入頁面(不推薦)

既然白屏的原因就是app預載入頁面彈出造成的,我們可以把它隱藏掉。

<style name="StartTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="android:windowDisablePreview">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowBackground">@android:color/white</item>
    </style>

把windowDisablePreview設定成true,這樣就不會出現白屏和黑屏的問題然而會使我們點選app的時候會短暫的停留在手機螢幕一段時間然後直接進入LAUNCHER_ACTIVITY,造成一種手機卡頓的現象,在效能差的手機上更明顯。(360手機助手就是這種現象)

(2)為啟動頁Theme設定一個透明背景(不推薦)

<style name="StartTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowActionBar">false</item>
        <item name="android:windowBackground">@android:color/white</item>
    </style>

把windowIsTranslucent設定成true,類似於把預載入頁面隱藏了,最終效果類似於隱藏預載入頁面。

(3)給啟動頁Theme設定一個和啟動頁一樣的背景圖片

<style name="StartTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@drawable/layer_launcher</item>
        <item name="android:windowFullscreen">true</item>
    </style>
為解決不同螢幕手機圖片被拉伸的問題(華為手機虛擬鍵盤),我們建立一個layer-list drawable檔案。這也解決了啟動頁圖片跳躍的問題。
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white" />
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/background" />
    </item>
</layer-list>

同時註釋掉// setContentView(R.layout.activity_logo);,這樣就保證了預載入頁面和啟動頁一致。

3、特殊情況

做完上面的操作基本上已經解決了閃屏的問題。當在觀察華為手機時,再從預載入頁面切到LAUNCHER_ACTIVITY時會閃一下(淘寶啟動頁偶爾就會出現)。原因可能是在LAUNCHER_ACTIVITY的onCreate中執行了一些反序列化和網路請求等耗時操作。我的解決方式是建立一個Handle延遲一秒執行初始化操作。

new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                mSharedPreferences = getSharedPreferences("phone", Context.MODE_PRIVATE);
                //友盟
                MobclickAgent.setDebugMode(true);
                MobclickAgent.enableEncrypt(true);
                mRequestQueue = Volley.newRequestQueue(LogoActivity.this);
                getNewVersion();
            }
        },1000);
到此問題基本上就解決完了,要是有新的問題可以提一下。