一、应用的启动方式及过程:
应用的启动分为冷启动、热启动、温启动,其中冷启动是最慢的。
以下是应用冷启动的启动过程:
- 加载启动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);
... ...
}
}
对比效果:
处理前,启动后有白屏
处理后
三、App启动优化得其他一些通用做法:
1、利用主题样式 ,快速显示启动界面;
2、异步去初始化一些第三方得依赖模块;
3、尽量延后这些初始化动作;
4、避免在App启动时做一些业务的耗时操作。
主要注意避免在启动时做密集沉重的初始化。尽可能得延迟这些初始化。