App啟動優(yōu)化,防止黑白屏

問題描述

app啟動時,會出現(xiàn)一會兒的黑屏或者白屏才進入Activity的界面顯示,但是有些app卻不會,比如QQ,微信,微博等?

探究原因

當打開一個Activity時,如果這個Activity所屬的應用還沒有在運行,系統(tǒng)會為這個Activity所屬的應用創(chuàng)建一個進程,但進程的創(chuàng)建與初始化都需要時間,在這個動作完成之前系統(tǒng)要做什么呢?如果沒有任何反應的話,如果程序初始化的時間很長,用戶可能還以為沒有點到相應的位置。但此時所啟動的程序還沒初始化完,既無法顯示程序,又不能停在原處不做任何動作,怎么辦?這就有了Starting Window的概念,也可以稱之為Preview Window。

Starting Window就是一個用于在應用程序進程創(chuàng)建并初始化成功前顯示的臨時窗口,擁有的Window Type是TYPE_APPLICATION_STARTING。在程序初始化完成前顯示這個窗口,以告知用戶系統(tǒng)已經知道了他要打開這個應用并做出了響應,當程序初始化完成后顯示用戶UI并移除這個窗口。

顯示白屏或者黑屏,是由你的啟動Activity或者Application來決定的。如果你使用的是Light主題,那么就可能出現(xiàn)白屏;如果你使用的是Black主題,那么就可能出現(xiàn)黑屏。當你設置Light或者Black主題時,Starting Window顯示的就是你啟動Activity的android:windowBackground屬性,所以才會出現(xiàn)白屏或者黑屏的情況。

解決方案

通過上述的原因探究,我們一想“哎呀,尼瑪?shù)模瓉斫鉀Q方案不是TMD很簡單嘛,就是給啟動的activity添加一個指定的主題嘛!”,是的,我們的解決方案就是添加一個主題。

第一步 新建一個主題

在styles.xml文件中添加一個主題,我們就叫“SplashTheme”好吧

  <style name="SplashTheme" parent="AppTheme">
        <!-- 歡迎頁背景引用剛才寫好的 -->
        <item name="android:windowBackground">@drawable/splash_lancher</item>
        <item name="android:windowFullscreen">true</item>
        <!-- <item name="android:windowIsTranslucent">true</item> --> <!-- 透明背景不要了 -->
    </style>

第二步 添加一個layer-list

上述主題中我們發(fā)現(xiàn)android:windowBackground 似乎少了點什么,對嘛,我們少了個drawable,這個drawable我們可以直接用一個圖片代替,如果你還要加點其他東東,我們當然推薦使用layer-list來創(chuàng)建一個drawable的文件了,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 設置整個屏幕背景為白色 -->
    <item >
        <color android:color="@color/white"/>
    </item>
 
    <!-- 中間logo -->
    <item >
        <bitmap
            android:gravity="center"
            android:src="@drawable/ic_launcher" />
    </item>
    <!-- 底部圖表 -->
    <item android:bottom="10dp">
        <bitmap
            android:gravity="bottom|center_horizontal"
            android:src="@drawable/copyright" />
    </item>
 
</layer-list>

第三步 在AndroidManifest.xml中調用主題
在我們的啟動activity中添加如下代碼

        <activity
            android:name=".activity.SplashActivity"
            <--這里是我們添加的主題->
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

然后就大功告成了

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容