26
2017
09

解决APP冷启动白屏/黑屏的问题

解决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中是不存在的。


参考:
带你重新认识:Android Splash页秒开 Activity白屏 Activity黑屏

上一篇:建造者模式 下一篇:Android--ToolBar基本介绍