一、应用启动的三种状态
冷启动:系统不存在App进程(APP首次启动或APP被完全杀死)时启动APP,此时,APP的启动将经历两个阶段:
1、创建app进程:系统启动应用程序进程和虚拟机,创建app进程,app启动后第一时间显示空白window
2、创建应用程序对象、初始化、加载资源:创建application对象、创建主Activity对象、并执行onCreate方法、创建和显示应用程序主界面。
热启动:当我们按了Home键或其它情况app被切换到后台,再次启动app的过程。热启动是指应用程序在保留应用程序进程的情况下再次启动的启动方式,这种启动方式相对于冷启动要快得多,因为应用程序的许多资源和进程已经存在于系统内存中,不再需要重新创建和加载。
温启动:温启动包含了冷启动的一些操作,由于app进程依然在,温启动只执行冷启动的第二阶段,这代表着它比热启动有更多的开销。
这三种启动状态中,冷启动是一个从无到有的过程最为耗时,也是下面主要的优化方向。
二、冷启动优化方式
1、冷启动白屏优化
在app启动之后会立即展示一个空白的window,用于告诉用户当前正在启动app,但是这种方式显然不够美观,下面介绍两种方式对这种现象进行优化
1、禁用app启动时window预览功能(不显示空白的window)
在首屏Activity中添加一个主题,禁用window预览功能,并在manifest中使用
xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--禁用预览功能主题-->
<style name="AppSpalshNoPreviewTheme" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
<item name="windowNoTitle">true</item>
//禁用预览
<item name="android:windowDisablePreview">true</item>
</style>
</resources>
在manifest中使用
xml
<activity android:name=".SplashActivity"
android:theme="@style/AppSpalshNoPreviewTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
此时冷启动app,会卡顿一会再进入首activity,感觉就像手机卡了,用户体验不是很好,不建议使用!
2、给启动页Activity添加一个主题,设置一个背景
xml
<!--替换首屏的背景的主题-->
<style name="AppSpalshBackgroundTheme" parent="AppTheme">
<!--设置一个背景图片-->
<item name="android:windowBackground">@mipmap/wall</item>
<item name="android:windowFullscreen">true</item>
<item name="windowNoTitle">true</item>
</style>
然后在manifest中使用
xml
<activity android:name=".SplashActivity"
android:theme="@style/AppSpalshBackgroundTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
此时白屏就会被替换成首Activity主题中添加的背景图片,从而使程序更加美观,也会让用户有更好的体验
3、使用jetpack splashScreen
参考:深度探讨 Jetpack SplashScreen 如何重塑应用启动画面_setkeepvisiblecondition-CSDN博客
2、主页面布局优化
1、减少布局嵌套层次,复杂布局可以使用ConstraintLayout和RelativeLayout来替换LinearLayout
2、推荐使用merge标签,可以减少一个层级
3、使用ViewStub延迟加载
xml
<ViewStub
android:id="@+id/contentPanel"
android:inflatedId="@+id/inflatedStart"
android:layout="@layout/delayInflateLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
4、去掉多余背景色,减少复杂shape的使用
3、Application和主Activity的onCreate方法中的操作优化
1、Application的onCreate流程,对于大型的APP来说,通常会在这里做大量的通用组件的初始化操作;建议:一些三方的SDK,文件,设备,线程池,等等工具类不放在Application初始化,我们可以放到用到的地方才进行初始化操作。如果确实需要在这里初始化,可以开启一个子线程来初始化
2、不要在Application和主Activity的onCreate方法中执行耗时操作。