一、應用的啟動方式及過程:
應用的啟動分為冷啟動、熱啟動、溫啟動,其中冷啟動是最慢的。
以下是應用冷啟動的啟動過程:
- 加載啟動App;
- App啟動之後立即展示出一個空白頁;
- 建立App的程序;
- 建立App對象;
- 啟動Main Thread;
- 建立啟動的Activity對象;
- 加載View;
- 布置螢幕;
- 進行第一次繪制;
當在App啟動之後立即展示出一個空白頁,這個空白大概在1~2秒,然後再跳轉到App的正常界面,這種閃白對使用者的體驗度是有影響的,沒有點選桌面Icon立即響應的使用者體驗。另一方面,在實際開發中根據需求可能會依賴多個第三子產品,這些第三子產品一般會在建立App對象Application中進行初始化動作。這些初始化動作是比較耗時的,給使用者的直接回報是,停在啟動界面時間過長,體驗卡頓。
為此Google也給出了啟動優化的三個方向:
- 利用提前展示出來的Window,快速展示出來一個界面,給使用者快速回報的體驗;
- 避免在啟動時做密集沉重的初始化(Heavy app initialization);
- 定位問題:避免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);
... ...
}
}
對比效果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmL2MDOyIjN0MTM0EjMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
處理前,啟動後有白屏
處理後
三、App啟動優化得其他一些通用做法:
1、利用主題樣式 ,快速顯示啟動界面;
2、異步去初始化一些第三方得依賴子產品;
3、盡量延後這些初始化動作;
4、避免在App啟動時做一些業務的耗時操作。
主要注意避免在啟動時做密集沉重的初始化。盡可能得延遲這些初始化。