一.App的启动以及Application启动过程分析
- 从点击桌面Icon到我们第一个见面展示出来分为两个部分
1.系统去创建进程以及Application
2.Application到Acitivty - 第一部分是系统黑盒子模块,我们没有办法去通过代码优化,但是第二部分我们可以去通过代码进行优化。
冷启动
- App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载相关资源,启动 Main Thread,初始化首屏 Activity 等。在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至首屏 Activity 完全启动。
热启动
- 热启动意味着 App 进程只是处于后台,系统只是将其从后台带到前台展示给用户。类同与冷启动,在这个过程中,屏幕会显示一个空白的窗口(颜色基于主题),直至 activity 渲染完毕。
温启动
介于冷启动和热启动之间,一般来说在以下两种情况下发生:
- 用户返回退出了 App,然后又启动。进程可能还在运行,但是 activity 需要重建。
- 用户退出 App 后,系统可能由于内存原因将 App 杀死,进程和 activity 都需要重启,但是可以在 onCreate 中将被动杀死锁保存的状态(saved instance state)恢复。
二.黑白屏原因
- 当 App 的 theme 没有任何继承,这时候 App 的启动时候为黑屏屏。
<style name="AppTheme">
</style>
- 当 App 的 theme 继承于 Theme.AppCompat.Light,这时候 App 的启动时候为白屏。
<style name="AppTheme" parent="Theme.AppCompat.Light">
</style>
三.解决方案
- 由上面可以知道,黑白屏出现的原因是在 App 未完全启动的时候,出现了一个背景界面,来提示用户 App 正在启动中。
所以我们可以直接替换背景 android:windowBackground 为图片。可以使用广告进行宣传,这是目前常用的方案。
<!-- 为 Theme 设置背景图 -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:windowBackground">@drawable/bg</item>
</style>
- 设置 Theme 背景为透明的。这样虽然可以避免出现黑白屏的问题,但是这在一些低端手机上,还是会闪烁一下。而且有时候由于背景设置为透明的,会影响到 Activity 间的切换动画。
<!-- Theme 设置背景为透明的 -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:windowIsTranslucent">true</item>
</style>
- 直接把 Theme 的背景去掉,这样就不会出现黑白屏,也不会有设置 Theme 背景为透明的一些问题。
<!-- Theme 去掉背景 -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:windowDisablePreview">true</item>
</style>
- 注:不论是把 Theme 背景设置为透明的还是直接把背景去掉,这样又会回到问题的最起点,点击 App 图标进行启动,在 App 未完全启动的时候,用户不能确定 App 是否已经启动。所以不太推荐这样处理。
四.解决方案小优化
- 在使用为 Theme 设置背景图这个方案的时候,如果直接把这个设置添加 App 的 Theme 中,那么所有的 Acticity 都有默认使用这个背景,不太符合逻辑。所以一般是对 Acticity 进行设置。
<!-- Base application theme. -->
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/bg</item>
</style>
五.启动时间
- 在 App 启动的时候,我们可以把一些耗时的操作放在子线程中进行操作。特别是初始化一些第三方库文件,单这些操作没有创建 handler、没有操作 UI、对异步要求不高的时候,就可以把他放在子线程中进行操作。还有一些单例模式,有些单例模式初始化也比较复杂,耗时,可以采用懒加载方法进行加载。
- AppLauncher是一个轻量的Android App的任务启动器。
它是一个优秀的异步初始化解决方案,用来方便、快速的帮助APP处理异步初始化来达到应用启动的最佳性能。 - https://github.com/Ryan-Shz/AppLauncher
网友评论