解决APP冷启动白屏/黑屏的问题
本篇文章来自Hansion的博客
原文链接
转载请注明出处 谢谢!
原因
当启动一个APP时,孵化器zygote进程会创建一个新的进程去运行这个APP。
但创建进程需要一定时间,再创建完成前,界面不会作出反应。此时会给用户造成一种没有点击到APP的错觉,影响体验。
为了改善用户体验,Preview Window出现了,它会在创建进程这个期间显示,让用户感觉到APP启动了
而Preview Window就是白屏/黑屏的原因,
它是黑屏还是白屏,默认取决于第一个启动的Activity的Theme,如果该Activity没设置Theme,默认使用Application的Theme
- 黑屏:使用Black系列的主题时,Preview Window就是黑色
@android:style/Theme.Black"
- 白屏:使用Light系列的主题时,Preview Window就是白色
@android:style/Theme.Light"
解决办法(三种)
1.给Activity设置一个透明背景的主题(不推荐)
给Activity设置一个透明背景:
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">true</item>
</style>
在清单文件中,让第一个启动的Activity使用该主题
2.禁用Preview Window(不推荐)
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowDisablePreview">true</item>
</style>
在清单文件中,让第一个启动的Activity使用该主题
3.为Preview Window设置背景图、新增一个无多余操作的Activity
新建一个主题,设置windowBackground为一张图片
<style name="SplashTheme" parent="AppTheme">
<item name="android:windowBackground">@drawable/boot_page</item>
<item name="android:windowFullscreen">true</item>
</style>
也可以根据需求设置windowBackground为一个layer-list,在res/drawable下新建一个layer-list,名字随便取,比如splash.xml:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@drawable/boot_page" />
</layer-list>
新建一个Activity,使用该主题,注释掉 setContentView方法,仅用于跳转到原本的第一个启动的Activity
public class FirstActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_first);
startActivity(new Intent(this, SplashActivity.class));
finish();
}
}
不要忘了更改清单文件,让新增的Activity第一个启动
本方法最优,在没有虚拟键的手机上堪称完美。但遇到虚拟键,背景图就会有一次上下窜动。
参考了美团APP,它为了解决这个问题,去掉了上面自定义主题中的windowFullscreen属性,也就是说,不会隐藏虚拟按键,这也是一种权衡,需要自行选择。
但是,如果不隐藏虚拟按键,有可能会造成背景图片Y方向上挤压变形的问题,在背景上,要做一些针对性的优化。
另外,前两种解决方案基本上是相同的效果,之所以不推荐,是因为Preview Window的出现本来就是为了优化用户体验而出现的,虽然会带来白屏/黑屏的问题,但如果去掉Preview Window或者设置其为透明,那么违背了创造Preview Window的初衷,所以推荐第三种方案。
本文所针对的是release版本的APP,因为白屏问题还有一个原因可以引起,就是Android Studio 2.0的新增功能Instant Run引起的,如果使用了该功能,引起了白屏问题,我们不必在意,Instant Run引起的白屏问题在release版本的APP中是不存在的。