天天看點

性能優化(一): App啟動優化,解決啟動白屏、卡頓問題

一、應用的啟動方式及過程:

應用的啟動分為冷啟動、熱啟動、溫啟動,其中冷啟動是最慢的。

以下是應用冷啟動的啟動過程:

  1. 加載啟動App;
  2. App啟動之後立即展示出一個空白頁;
  3. 建立App的程序;
  4. 建立App對象;
  5. 啟動Main Thread;
  6. 建立啟動的Activity對象;
  7. 加載View;
  8. 布置螢幕;
  9. 進行第一次繪制;
當在App啟動之後立即展示出一個空白頁,這個空白大概在1~2秒,然後再跳轉到App的正常界面,這種閃白對使用者的體驗度是有影響的,沒有點選桌面Icon立即響應的使用者體驗。另一方面,在實際開發中根據需求可能會依賴多個第三子產品,這些第三子產品一般會在建立App對象Application中進行初始化動作。這些初始化動作是比較耗時的,給使用者的直接回報是,停在啟動界面時間過長,體驗卡頓。

為此Google也給出了啟動優化的三個方向:

  1. 利用提前展示出來的Window,快速展示出來一個界面,給使用者快速回報的體驗;
  2. 避免在啟動時做密集沉重的初始化(Heavy app initialization);
  3. 定位問題:避免I/O操作、反序列化、網絡操作、布局嵌套等。

二、 利用提前展示出來的Window,快速展示出來一個界面,給使用者快速回報的體驗的實作方案;

1、在drawable檔案夾下,建立一個start_activity_background.xml檔案;
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
    <!-- The background color, preferably the same as your normal theme -->
    <item android:drawable="@android:color/white"/>
    <!-- Your product logo - 144dp color version of your app icon -->
    <item>
        <bitmap
            android:src="@drawable/activity_welcome_welcome_pic"//啟動頁底圖
            android:gravity="fill"//完全填充
            />
    </item>
</layer-list>
           
 2、在styles.xml檔案中建立一個StartTheme樣式主題;
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    //APP啟動優化
    <style name="StartTheme" parent="Theme.AppCompat.Light.NoActionBar">
        //引用上面start_activity_background.xml背景檔案
        <item name="android:windowBackground">@drawable/start_activity_background</item>
        <item name="android:windowFullscreen">true</item> //填充整個視窗設定
    </style>

   ... ...

</resources>
<!---->
           
3、在 AndroidManifest.xml檔案中替換主題樣式;
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.frame.pr_framedemo">

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/StartTheme">//替換為StartTheme主題樣式

        ... ...

    </application>

</manifest>
           
4、在啟動後的Activity界面中動态的替換回App的正常主題樣式。注意一定要super.onCreate()之前;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        //APP啟動優化,動态設定回正确的主題樣式,注意一定要super.onCreate()之前
        setTheme(R.style.AppTheme);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        ... ...
    }

}
           

 對比效果:

性能優化(一): App啟動優化,解決啟動白屏、卡頓問題

                               處理前,啟動後有白屏

性能優化(一): App啟動優化,解決啟動白屏、卡頓問題

                                                          處理後

三、App啟動優化得其他一些通用做法:

1、利用主題樣式 ,快速顯示啟動界面;

2、異步去初始化一些第三方得依賴子產品;

3、盡量延後這些初始化動作;

4、避免在App啟動時做一些業務的耗時操作。

主要注意避免在啟動時做密集沉重的初始化。盡可能得延遲這些初始化。

繼續閱讀