APP啟動時,界面會首先展示一個白屏或者黑屏,然后再進入歡迎頁,稍作停留最后進入APP主頁。進程的創建是需要時間的,在創建完成之前,界面是呈現假死狀態的,這可能會讓用戶會以為沒有點到APP而再次點擊,極大的降低了用戶體驗,Android需要及時做出反饋去避免這段時間的尷尬。于是系統會根據你的manifest文件設置的主題顏色的不同來展示一個白屏或者黑屏。這個黑(白)屏就稱為Preview Window,即預覽窗口。
安卓啟動方式一般有3種:
>Coldstart——冷啟動:
此種方式最為耗時,一般是因為進程被干掉或者是第一次啟動app,系統需要重新fork進程進行一系列初始化,后臺沒有該應用的進程。
>WarmStart ——暖啟動
比ColdStart稍快,當app的Activities被銷毀,但還在內存中常駐時啟動方式會變為暖啟動,app并沒有被殺掉,所做的只是把app從后臺提到前臺來展示,并不需要重走初始化一系列行為,減少了對象初始化、布局加載等工作。但其表現行為與冷啟動一致,還是會先顯示一個Preview Window(黑白屏)直到app渲染activity。
如果由于響應了低內存事件,例如在onTrimMemory()方法中清除了資源對象,那么這些對象就需要在熱啟動時重新創建。
>LukeWarm Start——熱啟動
啟動方式最快,比暖啟動開銷小,類似于按返回鍵back、home鍵退出應用又立即進入的那種行為,后臺已有該應用的進程。
接下來看看如何優化冷啟動:
既然我們已經找到這個黑白屏是出自系統的預覽窗口,我們就可以通過操控這個窗口來實現。這個預覽窗口是在activity啟動頁前顯示的一個安卓優化措施,我們可以從主題中可以找到,是可以設置這個窗口配置的。
1.更改窗口的顏色背景
2.設置窗口全屏顯示
在Manifest文件中的啟動頁activity添加自定義的主題android:theme="@style/SplashTheme"
接下來看看style的屬性配置,父主題可使用parent="@android:style/Theme.NoTitleBar.Fullscreen"
以上name="android:windowBackground”背景你可以設置多種,如果是設置為透明要將<item name="android:windowIsTranslucent">true</item>設置為true,當點擊運行app后是透明背景的,給人的一種系統響應慢的錯覺,完美甩鍋。若是設置一張圖片,也要設置<item name="android:windowIsTranslucent">false</item>,即可實現秒開閃屏效果。而我這里是在drawable中新建splashx_bg.xml使用bitmap位圖設置的背景圖,能夠對圖片做更多的設置操作。
最后注意:Preview Window設置的背景圖如果不做處理,圖片就會一直存在于內存中,所以,當我們進入到歡迎頁的時候可不要忘了把背景圖設置為空
透明背景:
位圖bitmap加載:
直接設置圖片:
2018/11/2最后補充一下需要注意:在Android 8.0即api26,谷歌對于AndroidManifest.xml中設置了鎖定屏幕android:screenOrientation="portrait"的透明activity會報以下錯誤“Only fullscreen opaque activities can request orientation”,經測試不管是否全屏都如此,在8.1后谷歌修復了這個bug。解決方法我個人是去掉鎖定屏幕設置或者將android:theme="@style/SplashTheme"中的透明背景設置均改為不透明android:windowIsTranslucent改為false?參考傳送門,建議采用圖層設置位圖bitmap的方式易于適配(劉海屏等)