前言
Android系统上,当启动应用时存在闪白屏或者黑屏,这种问题很常见。
产生原因:
当系统启动一个APP时,zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,因为用户会以为没有点到APP而再次点击,这极大的降低用户体验,Android需要及时做出反馈去避免这段迷之尴尬。于是,Android系统根据你的AndroidManifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。
而这个黑(白)屏正式的称呼应该是Preview Window,即预览窗口。
总结
三种方式都可以解决闪黑屏或白屏问题,但各有优点和缺点。
- 设置android:windowBackground,我的应用不存在启动logo,因此这个对我的应用不行。
- 设置android:windowIsTranslucent,除了存在卡几秒响应,还会导致其他交互的Activity的生命周期异常,由于部分逻辑依赖Activity周期,因此对于我的应用不行。
- 设置android:windowDisablePreview 开历史倒车,存在卡顿几秒,这个是目前三个方式中比较合适的(相比而言)
由于使用场景不一,采用的方式不用,这个自己舍取。
正文
根据自己经验和网上网友整理,下面我们说说存在的解决方式。
windowBackground
这个是设置主题样式窗口的背景图,如下
<style name="media_default_theme" parent="@android:style/Theme.NoTitleBar.Fullscreen"> <item name="android:windowIsTranslucent">false</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowBackground">@drawable/default_bg</item> </style>
设置一张窗口的背景图,会让用户感觉非常快。
优点: 可以解决闪黑屏和白屏问题,同时让人觉得启动快。
缺点:如果不允许设置启动窗口背景就麻烦了(勉强算一个缺点)
windowIsTranslucent
这个是设置窗口为透明窗口
<style name="media_default_theme" parent="@android:style/Theme.NoTitleBar.Fullscreen"> <item name="android:windowIsTranslucent">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowNoTitle">true</item> </style>
这样也可以解决黑屏或白屏问题。
优点: 可以解决闪黑屏和白屏问题
缺点: (1)点击后,响应慢了一点,让人觉得启动卡顿(2)会导致切换时其他Activity生命周期异常
会导致切换时其他Activity生命周期异常
上面说了,透明窗口会导致启动的Activity的周期异常。
A Activity : 主题没有透明属性
B Activity : 主题带有透明属性
先启动A Activity,然后启动B Activity,可以通过B Activity启动(或者其他方式)启动A Activity。
下面是A Activity生命周期的打印日志:
onNewIntent : onResume : onPause: onResume:
上面可以看出,onResume启动了两次,所以如果项目中有依赖生命周期的功能话就存在一定的问题。
windowDisablePreview
这个属性就是禁止窗口预览动画,就是开历史倒车。
<style name="media_default_theme" parent="@android:style/Theme.NoTitleBar.Fullscreen"> <item name="android:windowDisablePreview">true</item> </style>
优点: 可以借闪黑屏和白屏问题
缺点:点击后,响应慢了一点,让人觉得启动卡顿。
参考文章