Android Activity啟動黑/白屏原因與解決方式


Android Activity啟動黑/白屏原因與解決方式

  我們新建一個HelloWorld項目,運行在手機上時,Activity打開之前會有一個動畫,而這個動畫里是全白或者全黑的(取決於你的主題是亮還是暗),我們結束進程並點擊在桌面上的APP圖標,同樣會有這個現象出現。當我們打開手機上安裝的各個公司的APP時,可以發現其中大部分APP的啟動動畫都是有顏色有圖案的,當然也有一小部分APP是全黑或全白的。那么為什么會出現這種情況呢?

  Activity啟動黑/白屏的原因

  一個Activity的顯示內容有哪些呢?我們在Activity的onCreate()方法中調用了setContentView()方法,傳入了我們繪制的layout文件,也就是我們理論上應該看到的Activity內容。但是Android系統在啟動一個新的Activity時,首先進行的並不是繪制Activity Content View,我們來看看一個Activity的UI結構。

  我們可以看到,一個Activity中在ContentView的外圍還有PhoneWindow、DecorView、TitleView,當Activity進行繪制時會先繪制這三個控件,這時ContentView還沒加載進來,所以什么東西都看不到,系統會將屏幕填充主題默認的背景色,亮系主題填充白色,暗系主題填充黑色,就出現了Activity啟動之前的黑/白屏現象。

  解決辦法

  剛才說了,系統會為屏幕填充主題默認的背景色,那么要解決這個問題就應該從屏幕的背景下手了。一想到背景,第一反應就是去layout里設置ContentView的background,但是系統並不會先加載ContentView,那有什么在系統繪制之前就能調整屏幕背景呢?注意,系統會填充主題默認的背景色,所以主題會在繪制之前加載,我們可以修改主題的背景達到目的。一般一個APP第一個啟動的Activity都是Splash,作為一個Splash並不需要標題欄,而且普遍是全屏的。那么我們可以將主題進行修改一下:

  (1)將主題背景變成透明的,這樣在ContentView加載出來之前,我們會透過啟動的Activity看到桌面,就不會有黑/白屏的現象。再把標題欄去掉,把Activity設置成全屏的,效果挺不錯,缺點是如果啟動的是一個有復雜耗時操作的Activity,那么會有一種延遲的感覺。

<style name="AppTheme" parent="android:Theme.Light.NoTitleBar">  
    <item name="android:windowIsTranslucent">true</item>  
    <item name="android:windowNoTitle">true</item>  
    <item name="android:windowActionBar">false</item>  
    <item name="android:windowBackground">@android:color/transparent</item>  
    <item name="android:WindowFullscreen">true</item>
</style>  

  (2)將主題背景設置成一張圖片,但是圖片的屏幕適配問題就需要考慮了,主題里的背景圖片會自動拉伸。

<style name="AppTheme" parent="android:Theme.Light.NoTitleBar">  
    <item name="android:windowNoTitle">true</item>  
    <item name="android:windowActionBar">false</item>  
    <item name="android:windowBackground">@drawable/bg_splash</item>  
    <item name="android:WindowFullscreen">true</item>
</style> 

  我建議使用第一種方式,盡量減少Splash里的耗時操作,主要操作交給MainActivity才是一個明智的選擇。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM