1、为什么App启动时会出现白屏或者黑屏?

当打开一个activity,所属activity的app还没有运行,系统会为这个app创建一个进程。但进程的创建和初始化都需要时间,在此之前系统要做什么呢?,如果没有任何反应的话,如果程序初始化时间很长,用户以为没有点到相应的位置。但此时所启动的程序还没有初始化完,既无法显示程序,又不能停在原处不做任何动作,怎么办?这就有了Starting Window的概念,也可以称之为Preview Window。

Starting Window 就是一个用于在应用程序进程创建并初始化成功前显示的临时窗口 拥有的Window Type 是 TYPE_APPLICATION_STARTING在程序初始化完成前显示这个窗口,以告知用户系统已经知道了他要打开这个应用并做出了响应,当程序初始化完成后显示用户UI并移除这个窗口。

显示白屏或者黑屏,是由你的启动Activity或者Application来觉得的。如果你使用的是Light主题,那么就可能出现白屏;如果你使用的是Black主题,那么就可能出现黑屏。当你设置Light或者Black主题时,Starting Window 显示的就是你启动Activity的android:windowBackground属性,所以才会出现白屏或者黑屏的情况。

2、怎么解决白屏或者黑屏的问题呢?

在style.xml文件中为启动的Activity设置主题,设置android:windowBackground属性为启动Activity显示的闪屏图片,这样才有app秒开的效果。设置android:windowFullscreen属性为true,使闪屏图片全屏显示。设置windowNotitle属性为true,隐藏Activity的ActionBar显示。

<style name="SplashTheme" partent="AppBaseTheme">
         <item name="android:windowBackground"> @mipmap/img_start</item>
         <item name="android:windowFullscreen">true</item>
         <item name="android:windowActionNotitle">true</item>
</style>

然后,在清单文件AndroidManifest.xml,为启动的Activity设置主题SplashTheme。

<activity 
       android:name="SplashActivity"
       android:theme="@style/SplashTheme">
         <intent-filter>
                   <action android:name="android.intent.action.MAIN"/>
                   <category android name ="android.intent.category.LAUNCHER"/>
        </intent-filter>
</activity>

此外,如果设置android:windowIsTranslucent属性,表明该窗口是半透明的,这样也不会出现白屏或者黑屏。但是,它和MainActivity的显示是同步,如果MainActivity启动的时候,有过多复杂的操作,就会出现在手机中点击了应用程序的图标之后,但是过两秒才会打开应用程序不好的卡顿体验效果。

3、还有没有其他解决方法?

以上的方式可以实现APP秒开,但是我不想c,那么你也可以显示纯颜色,或者纯颜色加小图标。

Starting Window 显示纯颜色,直接设置android:windowBackground属性为颜色代码:

<item name="android:windowBackground"> @color/colorAccent</item>
Starting Window 显示纯颜色加图标,需要在Drawable中定义一个Splash.xml文件:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/red"/>
        <item>
              <bitmap android:gravity="center" android:src ="@mipmap/start_img">
        </item>
</layer-list>

设置有图片纯颜色的

<style name="splashTheme" partent="AppBaseTheme">
        <item android:windowBackground>@drawable/yourslayout</item>
        <item android:windowFullscreen> true</item>
        <item android:windowNotitle>true</item>
</style>