Android歡迎頁短暫白屏問題以及解決方案
在掘金上看到一篇關於歡迎頁白屏的問題發現自己的app也有,所以按照作者的方法試了下,確實解決了白屏問題,但是會出現記憶體上的問題,所以又試了其他方法,在這總結一下。
問題描述:在桌面點選app後出現順序:白屏–歡迎頁–主介面(或者登陸頁)
白屏的可能性有:
- 應用application中做了太多耗時操作
- 歡迎頁Activity耗時太長
- 應用冷啟動和熱啟動
冷啟動表示後臺程序中沒有這個應用,在桌面上點選app圖示時開啟app需要建立application,熱啟動就是後臺已經有這個應用了,點開直接初始化MainActivity,不需要重新初始化application
解決方法
所以可以新建專案測試下在不自定義application的情況下,新增一個歡迎頁,看看是否有白屏,由啟動方式可知,冷啟動的時候,白屏是不可避免的,騰訊的產品大多是讓使用者點選圖示後先靜止一段時間,這種方式也可以借鑑。熱啟動是可以優化的。
考慮是不是設定歡迎頁佈局耗時太長的原因
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
long startTime = System.currentTimeMillis();
setContentView(R.layout.activity_splash);
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
Log.d("SplashActivity", "time:" + time);
輸出:
時間還挺長的,那如何縮短這些時間呢?
- 使用theme設定背景代替setContentView
在style中定義:
<style name="StartTheme" parent="AppTheme">
<item name="android:windowBackground">@mipmap/splash2</item>
</style>
在activity中配置
<activity android:name=".index.ui.SplashActivity"
android:theme="@style/StartTheme">
</activity>
這樣在啟動的時候確實不會出現白屏了,感覺很不錯,但是有個缺點就是,這張splash圖片是寫在theme中的,圖片的記憶體釋放不掉,所以還有待改進,可以使用下一種方法
- 在activity的onCreate方法的super前給window設定背景
getWindow().getDecorView().setBackgroundResource(R.mipmap.splash2);
這種方法也可以
兩種方法的對比
第一種通過主題來設定的缺點是使得圖片記憶體不能回收,優點是很好的解決了白屏問題,點開app幾乎看不到白,直接顯示歡迎頁,體驗提高了,第二種通過設定window的背景來解決,缺點是還有幾毫秒的空白,給人閃屏的感覺,但是這個空白時間確實比最初的白屏時間短。優點是圖片資源在splashActivity銷燬後可以回收,不會對記憶體有太大影響。
那有沒有既可以不對記憶體造成影響又不出現類似閃屏的現象的解決方法呢?經過谷歌搜尋,找到了一個解決方法,測試過了,暫時沒發現問題。
還是使用第二種給window設定背景的方法,但是需要在application的theme下的style標籤下新增一個item標籤< item name="android:windowIsTranslucent" >true</item>
顧名思義,設定window為透明,需要注意的是設定這個屬性後如果有如果原來有切換動畫的話,這個動畫會消失。
總結:
對比三種解決方案,如果沒使用過度動畫,則使用第三種,使用了切換動畫則使用第二種,,第一種肯定不是最好的,安卓機對記憶體的要求還是挺高的,記憶體優化也是一個重要的問題。
參考文章: