android冷啟動優化

rowandjj發表於2015-12-14

android冷啟動優化

1. 什麼是冷啟動

冷啟動指的是應用第一次啟動或者應用被殺死(不在記憶體中)後重新啟動的情況。
你可能已經發現了,這種情況下啟動時間會稍長一點。因為它會重新初始化資源(Application等)。

app啟動時通常會在Application或者所謂的SplashActivity中做初始化工作。如果Application中的工作過多的話, 那麼當冷啟動的時候,就會出現白屏情況,因為此時SplashActivity還沒有被初始化,SplashActivity上的圖片還沒有被顯示出來。

我們當然不希望出現白屏的情況。

解決方案應該從兩方面考慮,1是優化Application的初始化邏輯,比如該非同步的非同步,該延遲的延遲。2是將白屏換成SplashActivity中展示的圖片,讓使用者有一種應用已經啟動了的錯覺,本文講的就是這種優化方案。

2. 如何優化

我們需要為SplashActivity設定一個Theme,如下:

styles.xml

 <style name="AppTheme.Launcher">
        <item name="android:windowBackground">@drawable/launch_screen</item>
        <item name="android:windowFullscreen">true</item>
 </style>

這個Theme繼承了app的基礎主題AppTheme,同時複寫了windowBackground屬性,它的值即SplashActivity將展示的圖片(logo等等…)。

launch_screen.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">

    <item android:drawable="@android:color/white"/>
    <!-- Your product logo - 144dp color version of your app icon -->
    <item>
        <bitmap
            android:src="@drawable/splash_defalut"
            android:gravity="fill"/>
    </item>
</layer-list>

然後將這個主題設定到SplashActivity上:

 <activity
        android:name=".ui.activity.SplashActivity"
        android:configChanges="fontScale"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.Launcher"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

這還沒有完,因為我們為SplashActivity多設定了一個背景圖,必然會導致過渡繪製,所以我們在其初始化前,將主題設定回原來的:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_activity);

以上。

現在你會發現即使啟動時間再長,也不會出現白屏

參考:

  1. https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd

相關文章