關於android app啟動頁白屏黑屏和華為手機啟動頁圖片跳躍閃屏的問題
關於點選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);
到此問題基本上就解決完了,要是有新的問題可以提一下。