关于APP冷启动时最开始的白屏以及处理方式

一.冷启动与热启动

通常情况下app的启动方式包括冷启动和热启动,当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动,如果后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台),这种启动会从已有的进程中来启动应用,这个方式叫热启动。而二者不同的地方就在于冷启动是重头开始创建应用进程,热启动更像是唤醒应用进程,所以冷启动会从Application到MainActivity逐一创建,而热启动则没有创建Application这一步,我们会看到白屏的情况一般都是在冷启动的状态下发生的。我们冷启动app时首先展示的就是空白的启动窗口,因为此时application没有完成创建,这就是为什么会出现一段时间的白屏。

二.处理方式

如果想要避免白屏,首先就不要在application的onCreate方法中进程大量的耗时操作,并且还要在AndroidManifest配置文件中指定一个自带背景图片的初始主题,这个图片就可以取代白屏,一般我们会用这张背景图片来对我们的app进行说明或者是欢迎用户登录等等,是一种增加用户交互体验的方式。

自定义主题首先要写一个设置背景的start_background.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:opacity="opaque">    
    <item android:drawable="@android:color/white" />    
    <item>
        <bitmap 
            android:src="@mipmap/login_bg" 
            android:gravity="fill"/>
    </item>
</layer-list>

在主题配置文件styles.xml中自定义主题:

//APP启动优化,去除白屏
<style name="StartTheme" parent="Theme.AppCompat.Light.NoActionBar">
   //引用上面start_activity_background.xml背景文件        
   <item name="android:windowBackground">@drawable/start_background</item>
   <item name="android:windowFullscreen">true</item> //填充整个窗口设置
</style>

最后在AndroidManifest文件中设置这个初始主题:

<application
        android:name=".application.MainApplication"
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/icon"
        android:supportsRtl="true"
        android:theme="@style/StartTheme">

    ...

这样在冷启动app时就不会再出现白屏的情况,但是这个主题只能在最开始的时候使用一次,application将界面交给MainActivity之后就不能再使用这个主题,否则MainActivity就会把代替白屏的图片作为默认背景,之后的所有activity都是如此。更换主题就需要在activity的onCreate方法中调用setTheme(R.style.AppTheme)方法,这个方法要在super.onCreate之前调用。但是,仅仅只在一个activity中重新设置主题只对当前活动有效,那我们每创建一个活动难道都要设置一次主题吗?我们可以写一个activity的基类并复写onCreate方法,在方法中重新设置主题,让所有的activity都继承自这个基类就可以了,就不需要在每一个activity中都要写一遍setTheme方法。