app出現白屏的解決方案(App突然白屏進不去了)

閃屏頁簡介

閃屏頁,我們手機上的每個 APP 幾乎都有自己的閃屏頁,就是在真正進入程式前,會有一個頁面停頓幾秒鐘。其實我們完全可以充分利用好這幾秒鐘做很多的程式初始化了啟動。

宣告

為什麼我的 APP 啟動會白屏或者黑屏

有時候我們會發現,我們在啟動我們自己的 APP 的時候,總是有那麼點時間是白屏(黑屏),經過了白屏(黑屏)後才會進入我們的 APP。那麼這是為什麼呢?

模擬效果

下面我們模擬一下白屏的效果

20190522-splash開啟.gif

可以看到開啟 APP 的時候會有白屏的現象出現,當然我的這個演示 APP 程式沒有那麼複雜,因此我為了實現這種效果,就在 Application 中做了個睡眠。

 @Override public void onCreate() { super.onCreate(); myApplication = this; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }

   

這樣就是出現了這種白屏的效果,由此可以得出結論,如果程式很複雜,並且有很多的初始化放到了 Application 中去完成了,那麼這個時候剛開啟程式的時候就會有個耗時,就會出現白屏的效果。

所以這裡程式載入有個順序,當開啟一個 Activity 的時候,並且這個 Activity 所屬的 Application 還沒有執行,系統會首先為這個 Activity 建立一個程序,建立程序的時候就會呼叫 Application 的 onCreate 方法。程序的建立和 onCreate 內部的初始化是需要時間的,如果這個時候過長,沒有任何反應的話,那麼對於使用者來說是不不知道的,使用者還以為自己沒有點到呢,所以很顯然是不可能在原頁面等待載入的,那麼這個時候就有了 StartingWindow(PerviewWindow)的出現,StartingWindow 出現在應用程式程序建立並且初始化完成之前,是個臨時的視窗,對應的 WindowType是 TYPE_APPLICATION_STARTING 作用就是告訴使用者,系統已經收到我們的操作了,正在對程式進行初始化,只要初始化完畢後就會移除這個視窗。

所以其實我們看到的白屏或者黑屏就是 StartingWindow,那麼為什麼是白色或者黑色呢?我們一般都會給我們的 Application 和 Activity 設定 Theme,系統就會根據我們所設定的 Theme 來決定 StartingWindow 的顏色。我們都知道 Window 佈局的頂層是 DecorView,而 StaringWindow 顯示的是一個空的 DecorView,只是這個 DecorView 會應用我們的這個 Activity 所指定的 Theme。我們預設的 Theme 是 @android:style/Theme.Light 的話,這個時候就會產生白屏了。黑屏就是應用了 @android:style/Theme.Black,好了到這裡我們就徹底明白為什麼會出現白屏或者黑屏了。再順便說一下 Activity 佈局的繪製順序:

  1. 繪製背景
  2. 繪製 View 本身的內容
  3. 繪製子 View
  4. 繪製修飾內容(例如滾動條)

解決黑白屏問題

通過上面我們已經知道為什麼會出現這個問題了,那麼解決起來就很簡單了,只需要給啟動頁的樣式新增一個背景就可以了,這樣就達到了秒開的效果了!

@drawble/splashtrue設定的這個背景要和我的啟動頁搭配起來就行了!

       

個人號.png