在項目中有沒有覺得自己App啟動慢,第一次啟動的時候會有0.5s的白屏,項目經理有沒有提出這個細節呢?或許你沒有注意,或許你已經解決了,但是App冷啟動都是繞不開的話題。
為什么 APP 啟動時會出現白屏或者黑屏?
當打開一個 Activity 時,如果這個 Activity 所屬的應用還沒有在運行,系統會為這個 Activity 所屬的應用創建一個進程,但進程的創建與初始化都需要時間,在這個動作完成之前系統要做什么呢?如果沒有任何反應的話,如果程序初始化的時間很長,用戶可能還以為沒有點到相應的位置。但此時所啟動的程序還沒初始化完,既無法顯示程序,又不能停在原處不做任何動作,怎么辦?這就有了Starting Window的概念,也可以稱之為Preview Window。
Starting Window 就是一個用于在應用程序進程創建并初始化成功前顯示的臨時窗口。在程序初始化完成前顯示這個窗口,以告知用戶系統已經知道了他要打開這個應用并做出了響應,當程序初始化完成后顯示用戶 UI 并移除這個窗口。
顯示白屏或者黑屏,是由你的啟動 Activity 或者 Application 來決定的。如果你使用的是 Light 主題,那么就可能出現白屏;如果你使用的是 Black 主題,那么就可能出現黑屏。當你設置 Light 或者 Black 主題時,Starting Window 顯示的就是你啟動 Activity 的 android:windowBackground 屬性,所以才會出現白屏或者黑屏的情況。
解決方案:
1.讓窗口透明,啟動的時候就看不到白色窗口了。
2.給窗口加上背景,一進來就顯示出來啊,那白屏不就解決了嗎?
先學會常用的Theme主題功能:
Activity顯示為對話框模式
android:theme="@android:style/Theme.Dialog"
不顯示應用程序標題欄
android:theme="@android:style/Theme.NoTitleBar" ????
不顯示應用程序標題欄,并全屏
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" ????
背景為白色
android:theme="Theme.Light " ????
白色背景并無標題欄
android:theme="Theme.Light.NoTitleBar" ????
白色背景,無標題欄,全屏
android:theme="Theme.Light.NoTitleBar.Fullscreen" ????
背景黑色
android:theme="Theme.Black" ????
黑色背景并無標題欄
android:theme="Theme.Black.NoTitleBar" ????
黑色背景,無標題欄,全屏
android:theme="Theme.Black.NoTitleBar.Fullscreen" ????
用系統桌面為應用程序背景
android:theme="Theme.Wallpaper" ????
用系統桌面為應用程序背景,且無標題欄
android:theme="Theme.Wallpaper.NoTitleBar" ????
用系統桌面為應用程序背景,無標題欄,全屏
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" ????
透明背景
android:theme="Theme.Translucent"????
透明背景并無標題
android:theme="Theme.Translucent.NoTitleBar" ????
透明背景并無標題,全屏
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" ????
面板風格顯示
android:theme="Theme.Panel " ????
1.窗口透明做法:將該主題設置到啟動activity。 使用<item name="android:windowBackground">@android:color/transparent</item>設置背景為透明。
<style name="TransluteTheme" parent="AppTheme">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:screenOrientation">portrait</item>
</style>
透明方法效果圖:可以看出,點擊啟動圖標之后,雖然立即啟動了,但是窗口透明,沒有白屏,但是缺點就是啟動速度慢,沒有達到秒速啟動的效果。
2.偽布局做法(主流做法):將該主題設置到啟動activity。 使用<item name="android:windowBackground">@mipmap/splashbg</item>設置默認圖片為splashbg。
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowBackground">@mipmap/splashbg</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
默認背景圖:點擊啟動圖標立即加載窗口,立即顯示背景圖,達到秒速啟動效果。(ps:這張圖是我臨時做的一張,不滿效果,不要打我)
Application啟動優化如何做?
我們可以將application中的初始化放在一個單獨的線程中處理, 為了方便今后管理, 這里我用了一個IntentService來做初始化工作,service是運行在主線程中,而intentService運行在后臺線程中,在application中啟動intentservice。或者開啟協程切換到子線程進行初始化操作。
好了,功能實現了。喜歡我就點我吧,博客持續更新中,最實用的項目功能就在其中。