前言
在Android手机中,打开一个App,就会先展示一个白屏,然后才是进入欢迎页面。为什么会有白屏呢?
白屏是什么
首先我们要知道这个白屏是什么,才能去解决这个问题。我们知道Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog、还是Toast,他们的视图实际上都是附加在Window上的。没错,这个白屏,就是Window的背景。
我们先来看一下Android中App的启动过程:
1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。 2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。 3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。
而系统执行这个过程是需要时间的,在创建完成之前,界面是呈现假死状态的,因为用户会以为没有点到APP而再次点击,这极大的降低用户体验,Android需要及时做出反馈去避免这段尴尬。于是系统根据你的manifest文件设置的主题颜色来展示一个白屏或者黑屏,这个窗口,我们称为预览窗口。
解决方案
既然知道了原因,那么怎么解决呢,这里有这么几个解决的方法:
禁止加载或者设置透明
<style name="NoPreViewTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowDisablePreview">true</item>
</style>
通过创建一个Style,并且设置windoDisablePreview为true,那么就禁止了预览窗口的启动。
<style name="NoPreViewTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
</style>
或者是通过设定windowIsTranslucent 为true的方式,使预览窗口透明,那么也能打到同样的效果。
但是这两种做法是不推荐的,如果在你的入口Activity中有太多的操作导致,就会导致卡顿的不良用户体验。
自定义预览窗口:最佳方案
将预览窗口设置成一张图片,有着非常好的效果
<style name="PreViewTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@mipmap/login_bg</item>
</style>
当启动app时,会立即显示你要展示的图片,然后再进入你的欢迎页中。当然这样做不可避免就有了页面的跳转,所以我们在图片的选择上应当做到和欢迎页面最开始展示的界面相同。这样,用户就毫无感觉啦~~~