Android 應用白屏、黑屏、閃屏解決方法 (秒開應用思路)

當應用的界面需要時間渲染的時候,就會出現上面的白屏和黑屏問題;

問題復現:

  • 開機引導中有用戶協議一大串字符,導致打開卡機引導白屏

從上面知道了,就是因爲字符串太多了,需要渲染的時間較多,導致白屏了。

StartingWindow 惹的鍋

從 Android 的繪製流程我們知道,都是 先繪製背景再繪製內容 的。
但是,從Activity 的onCreate 中 setContentVeiw(),設置了佈局,那麼它就應該顯示我們的佈局了啊,怎麼還會出現上面這種情況呢?原因如下:
當我們打開一個應用的時候,Android 會檢測 Activity 所屬的 application ,如果該 application 進程還沒有創建,則系統會先創建 application ,這也是 application 比 activity早的原因。而 進程的創建是需要時間的,且創建之後, setContentView 的渲染也需要一定的時間,如果內存較低,或者view 的過於複雜,旋繞時間就比較長了;總的來說,就是進程的創建和初始化完成需要時間,如果這個時間比較久,就會出現上訴的情況。
那怎麼辦,進程都起來,總得讓用戶知道把,於是 就有了 startWindow 這個 window ,實際上它是一個準備過程,所以,當進程初始化完畢,UI渲染完成,它就會被移除,纔會顯示我們設計好的 View。而 startWindow 這個 window 就是白屏,黑屏罪魁禍首了。

那白屏,黑屏又是怎麼來的呢?

當 startWindow 啓動的時候,沒有什麼UI ,其實就是背景,當你的 theme 選擇是 Theme.AppCompat.Light 的時候,它就是白屏,當你選擇是 Theme.AppCompat.DayNight 的時候,它就是黑屏了。
知道了原理,就是我們只需要把背景設置成透明的,就沒有這個問題了,如下,設置主題的背景色:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
	 <!-- Customize your theme here. -->
	 <item name="android:windowFullscreen">true</item>
	 <item name="android:windowIsTranslucent">true</item>
	 ...

加上,解決問題

閃屏

由於背景是透明的,當從 開機引導進入 launcher 的時候,還發現了 閃屏的問題,想了想,其實加一個退出動畫就可以了,由於 activity 是 window 級別的,所以,style 如下:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <!--加個動畫-->
        ...
    </style>

    <!--window動畫-->
    <style name="TransAnim" parent="@android:style/Animation.Activity">
        <item name="android:windowEnterAnimation">@android:anim/fade_in</item>
        <item name="android:windowExitAnimation">@android:anim/fade_out</item>
    </style>

秒開應用思路

從上面知道白屏和黑屏的出現過程,把背景設置成透明就解決了,那就是每個應用再進入的時候,通常都會有個 SplashActivity,只要把它的背景設置成一張圖片,然後再 style 裏面設置:

<item name="android:windowBackground">@mipmap/splash</item>

看起來就是秒開了呢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章