APP启动那点事儿

一般的我们从手机桌面打开一个应用,最为常见的一种情况下是它经历一个短时间的 白屏黑屏 再到启动页面,再者是在 桌面短时间的停留 随后才到启动页面; 然而,这两者都是要花费些等待时间的(虽然没有很久),当然也是用户所不愿等而且不期望看到的,从用户感知上最为直接的体验就是要响应快并且加载也快。

那么要如何做到呢?,我们有必要事先了解下程序启动的内部机制。

启动过程的内部机制

  • ColdStart

    进程被系统杀掉或者第一次启动发生的状态

  • WarmStart

    app驻留在内存,所以系统所做的只是把app从后台带到前台, 免去了重复的对象初始化以及布局渲染等的操作,其表现形式跟ColdStart一样,也是一开始呈现一个空白页面直到app完成渲染让用户所看到

  • LukeWarm Start

    可以认为是ColdStart操作中的子集,系统所做的同样只是把app从后台带到前台,只不过较WarmStart来说开销小点。 比如用户主动退出程序随后又立即启动它。

app的启动可以是处于这三种状态中的一种,但是对于ColdStart来说,所要做的工作比其他两种状态要多;

处于ColdStart状态的一开始系统会立即渲染一个启动背景窗口紧接着才会去创建app进程, 经过一系列的对象创建,视图绘制,渲染之后把这个背景窗口替换成为你app的主活动视图(应用程序的入口类),然后你才能开始使用app。

优化建议

避免在Application和MainActivity的onCreate方法做过多繁重的初始化操作

很多依赖的三方sdk可以根据优先级,使用多线程、懒加载的方式,只加载当前立即需要用的,非必要的延后再操作

使用主题启动屏幕

上面提到的 白屏黑屏 正是ColdStart状态下一开始渲染的启动背景窗口 ,至于有时候白色或黑色取决于你主题的设置。

使用主题的Activity应该是一个闪屏页,不具有按钮事件,其他控件的交互行为,仅仅只是一个宣传页/logo页,应用必要的一些初始化操作。

1
2
3
4
5
//为你的MainActivity设置主题添加如下
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>

你会发觉没有这个 白屏黑屏 出现了,但是你去打开应用出现 桌面短时间的停留

最后的解决办法是设置闪屏页的windowBackground背景图:

1
2
3
4
5
6
7
8
9
10
//为你的MainActivity设置主题添加如下
<style name="app_theme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@drawable/launch_bg</item>
<item name="android:windowFullscreen">true</item>
</style>
打赏作者