对于启动页白屏或黑屏的问题,大家或多或少都遇到过,也解决过。但是真正了解它是什么原因造成的,了解的人可能不多。下面主要对造成启动白屏/黑屏的原因进行分析。

一 、出现的原因

在你手机开机到你打开你的app,中间其实经过了好多步骤。在这里我简单的描述一下,具体的步骤下来自行查阅资料。

     android 开机时首先会创建一个init的进程,它是由多个配置文件组成的,进程号为1。然后会启动一个zegote进程,然后启动systemService 最后启动launcher进程,创建桌面。

     (正文)当我们启动一个应用进程时,相对应的SystemService会去检查是否已经存在这样一个进程,如果存在就相当于从后台把这个沉睡的进程给拉起来了,由于事先已经创建过,保存了相对应的属性及对应的服务,这个过程叫做热启动,此时就不会出现启动白屏/黑屏的现象。相对应的当我们 点击app图标时,Systemservice检查之前没有创建过,就叫冷启动,此时,系统和app本身有很多工作要做。首先系统服务会先检查startActivity中的intent的信息,然后去创建进程,最后才是启动|Activity。上面我们提到的白屏/黑屏的现象就是在启动Activity前,系统服务检查及创建进程的过程中出现的。一般情况下,根据手机内存及处理速度相关,持续时间不确定。

系统在绘制页面加载布局之前,首先会初始化窗口(window),而在进行这一步的操作时,系统会根据我们设置的Theme来制定他的Theme的主题颜色,Window布局的顶层是DecorView,StartingWindow显示一个空的DecorView,我们在Style中的设置就决定了显示的是白屏还是黑屏。

二、解决的方法:

既然是根据Theme显示的黑屏还是白屏,我们就可以在Theme入手。在清单文件中给启动页配置Theme

1、在AndroidManifest文件中设置:

<activity
            android:name=".ui.SplashActivity"
            android:theme="@style/Theme.Splash"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

2、在style文件中定义:
 

<!--***************启动页Theme***************-->


    <style name="Theme.Splash" parent="AppTheme">
        <item name="windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@drawable/splash_pic</item>
        <item name="android:windowFullscreen">true</item>
    </style>

完成以上两步就解决了启动白屏/黑屏的问题。