App启动方式:
(1)冷启动:当启动应用时,后台没有该应用的进程,系统会重新创建一个新的进程分配给该应用,即冷启动。
(2)热启动:当启动应用时,后台已有该应用的进程(点击Back键或Home键退出,此时应用的进程依然在后台存活),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,即热启动。
启动APP时出现白屏或黑屏:
其实,黑屏或者白屏这里并不是不正常,而是还没加载到布局文件,就已经显示了window窗口背景,而在应用程序进程创建并初始化成功之前,系统会显示一个临时窗口Starting Window(也称作:Preview Window,它的WindowType是TYPE_APPLICATION_STARTING;在初始化完成之前展示,是为了尽快告知用户,系统已经知道他要打开该应用,并且已经对此做出了响应。待初始化完成后,系统会显示用户UI并移除该窗口)黑屏白屏就是window窗口背景。我们看到的黑屏或白屏就是不同Theme时对应的Window的背景。
解决方案:
使用透明主题:
<style name="AppTheme.Launcher" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
特点:应用启动慢,刷新同步,界面会一次性刷新出来。由于背景透明,初始化的过程中,用户看到的是桌面,给人一种点击之后稍等一会才一次性刷新出来的感觉。
注:话说微信启动时使用的就是类似这样的效果,但微信做了一定的优化处理,只在 冷启动 时才显示启动页,具体如何实现稍后会做详细介绍。
禁用Preview Window:
既然APP启动时的黑白屏是由Preview引起的,那系统有没有提供禁用的方法呢? 答案是肯定的。修改上述style 如下:
<style name="AppTheme.Launcher" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowDisablePreview">true</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
然而,黑白屏的问题是解决了,但点击应用图标后会有一段时间没有响应。用户体验不好,违背了优化的初衷,不推荐使用。
修改windowBackground属性(推荐):
通过windowBackground可以设置背景色、背景图片、能解析出图片的XML文件等
<style name="AppTheme.Launcher" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/launcher_bg</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
自定义layer-list: launcher_bg.xml 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<item>
<bitmap
android:gravity="center"
android:src="@drawable/launch_logo" />
</item>
</layer-list>
特点:应用启动快,非同步刷新,界面会先显示背景图,然后再刷新其他控件,比较推荐。