Android 避免APP啟動閃黑屏的解決辦法(Theme和Style)

來源:互聯網
上載者:User
閃黑屏的原因主要是我們啟動Activity的時候,需要跑完onCreate和onResume才會顯示介面 

前幾天Boss就反應說,機器每次啟動程式都會閃一下黑屏,這個客戶不接受。沒辦法,只能想想怎麼解決,最後找到了下面的方法。閃黑屏的原因主要是 我們啟動Activity的時候,需要跑完onCreate和onResume才會顯示介面。也就是說需要處理一些資料後,才會顯示。按照這種思路,是不 是我把初始化的工作盡量減少就可以避免黑屏?事實是,就算你onCreate啥都不做,仍然會閃一下黑屏,因為初始化解析介面時需要一定時間。下面是解決 辦法:
1、自訂Theme

複製代碼 代碼如下:
設定背景圖Theme
<style name="Theme.AppStartLoad" parent="android:Theme"> 
    <item name="android:windowBackground">@drawable/ipod_bg</item> 
    <item name="android:windowNoTitle">true</item> 
</style>
//2、設定透明Theme
<style name="Theme.AppStartLoadTranslucent" parent="android:Theme"> 
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowNoTitle">true</item> 
</style>


上面我定義了兩種Theme,第一種Theme就是設定一張背景圖。當程式啟動時,首先顯示這張背景圖,避免出現黑屏。第二種Theme是把樣式設定為透明,程式啟動後不會黑屏而是整個透明了,等到介面初始化完才一次性顯示出來。下面說說兩種方式的優缺點:
•Theme1 程式啟動快,介面先顯示背景圖,然後再重新整理其他介面控制項。給人重新整理不同步感覺。
•Theme2 給人程式啟動慢感覺,介面一次性刷出來,重新整理同步。
 
2、修改AndroidManifest.xml
為了使上面Theme生效,我們需要設定一些Activity的Theme

複製代碼 代碼如下:
<application
    android:allowBackup="true"
    android:icon="@drawable/ipod_icon"
    android:label="@string/app_name"
    android:launchMode="singleTask">
<!-- iPod主介面 -->
<activity
    android:name="com.apical.apicalipod.IPodMainActivity"
<!-- 使用上面定義的樣式 mythou-->
    android:theme="@style/Theme.AppStartLoad"
    android:label="@string/app_name" >
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
//......
</application>


•可以在Activity裡面增加上面自訂的樣式。另外在Application裡面增加也是可以的,而且是全域效果。
•自訂Theme放在 /res/values/styles.xml 裡面。如果沒有這個檔案,自己添加一個即可。
•如果存在多個Activity切換,中間也可能會存在短暫黑屏問題。原因也是Activity啟動的時候需要初始化載入資料,如果想避免這種情況,可以在你切換的Activity裡面增加上面的樣式。
•上面兩種樣式都可以避免黑屏。可以實際測試一下你的程式選擇一種效果。
•這個只是把黑屏避免了,但是如果你程式初始化啟動慢,還是會給人程式啟動慢的感覺。需要自行最佳化程式初始化過程。

3、Theme屬性詳解

複製代碼 代碼如下:
android:theme="@android:style/Theme.Dialog" //Activity顯示為對話方塊模式
android:theme="@android:style/Theme.NoTitleBar" //不顯示應用程式標題欄
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" //不顯示應用程式標題欄,並全屏
android:theme="Theme.Light " //背景為白色
android:theme="Theme.Light.NoTitleBar" //白色背景並無標題列
android:theme="Theme.Light.NoTitleBar.Fullscreen" //白色背景,無標題列,全屏
android:theme="Theme.Black" //背景黑色
android:theme="Theme.Black.NoTitleBar" //黑色背景並無標題列
android:theme="Theme.Black.NoTitleBar.Fullscreen" //黑色背景,無標題列,全屏
android:theme="Theme.Wallpaper" //用系統案頭為應用程式背景
android:theme="Theme.Wallpaper.NoTitleBar" //用系統案頭為應用程式背景,且無標題列
android:theme="Theme.Wallpaper.NoTitleBar.Fullscreen" //用系統案頭為應用程式背景,無標題列,全屏
android:theme="Theme.Translucent" //透明背景
android:theme="Theme.Translucent.NoTitleBar" //透明背景並無標題
android:theme="Theme.Translucent.NoTitleBar.Fullscreen" //透明背景並無標題,全屏
android:theme="Theme.Panel " //面板風格顯示
android:theme="Theme.Light.Panel" //平板風格顯示


4、Theme和Style
Android裡面除了Theme外還有Style,例如下面是Launcher裡面配置workspace的一個Style

複製代碼 代碼如下:
<style name="WorkspaceIcon">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:layout_gravity">center</item>
        <item name="android:gravity">center_horizontal</item>
        <item name="android:singleLine">true</item>
        <item name="android:ellipsize">marquee</item>
        <item name="android:textSize">12sp</item>
        <item name="android:textColor">#FFF</item>
        <item name="android:shadowRadius">2.0</item>
        <item name="android:shadowColor">#B0000000</item>
    </style>


Style可以理解為一組屬性集合,方便不同的View設定使用,我們在View裡面使用Style的時候,跟使用Theme是一樣的應用方法。那麼Style和Theme有什麼區別?

下面列出兩者區別:
•樣式用在單獨的View,如:Button、TextView等

•主題通過AndroidManifest.xml中的<application>和<activity>用在整個應用或者某個 Activity,主題對整個應用或某個Activity存在全域性影響。

•如果一個應用使用了主題,同時應用下的view也使用了樣式,那麼當主題與樣式屬性發生衝突時,樣式的優先順序高於主題。

上面就是通過Theme解決程式啟動閃黑屏問題,並且講解了Theme和Style,通過Theme配置,其實還可以做個歡迎頁面。不過我們都希望程式啟動速度越快越好,因此還是需要多多最佳化自己的程式。

 

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。