在App开发中,我们会发现启动App的时候,应用会先黑屏或者白屏后才进入到我们的第一个页面,这是因为当我们打开App时,我们的App可能还没初始化完成,系统为了响应我们的操作,首先会启动一个WindowType
为TYPE_APPLICATION_STARTING
的Window
,等App初始化完成后在移除这个Window
,所以我们看到的黑屏和白屏也就是这个Window
了。
但是为什么有的是黑的有的是白的呢,因为这个Window
默认会显示一个空的DecorView(Window顶层视图)
,这个DecorView
会应用Splash
页面所在Activity
的Theme
,如果没有指定,那么就会用Application
的Theme
。
所以我们可以自定义Splash
页面的Theme
来解决黑/白屏的问题,比如我们自定义的Theme
如下:
<style name="SplashTheme" parent="xxx">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
设置后,会发现启动我们的App虽然没有之前的问题了,但是会先延迟一会在进入Splash
页面,这是因为我们把Window
设置为透明的了,所以用户就会感觉我们的App
启动缓慢。
如果对这样的设置不满意,我们可以给这个Window
自定义一个背景,比如先自定义一个layer-list
命名为open_splash.xml
,注意这个layer-list
内容最好和Splash
页面相同,这样用户就会无感知了,如下:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splash_page_color" />
<item>
<bitmap
android:gravity="bottom"
android:src="@drawable/splash_bottom" />
</item>
</layer-list>
然后修改我们的Theme
,如下:
<style name="SplashTheme" parent="xxx">
<item name="android:windowFullscreen">true</item>
<item name="android:windowBackground">@drawable/open_splash</item>
</style>
此时在启动,我们就可以流畅的看到App的启动了。