Android APP启动页白(黑)屏问题及解决方法



一、引言

使用Android智能手机用户都有碰到过,当一个APP启动时,有的APP启动界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页。




这个白屏或者黑屏的问题真的很影响体验,除非是垄断功能的APP,否则用户真的会越来越少。体验过一个XX银行的APP,启动页白屏至少5秒,垄断行业,你不得不用。但商业APP就必须得优化了、否则真会没人用。

二、问题的根源

我们分析下白屏或者黑屏的根源,当系统启动一个APP时,Zygote进程会首先创建一个新的进程去运行这个APP,但是进程的创建是需要时间的,在创建完成之前,界面是呈现假死状态的,这就很尴尬了,因为用户会以为没有点到APP而再次点击,这极大的降低用户体验,Android需要及时做出反馈去避免这段迷之尴尬。于是系统根据项目Manifest文件设置的主题颜色的不同来展示一个白屏或者黑屏。而这个白(黑)屏正式的称呼应该是Preview Window,即预览窗口。

三、解决方法(自定义Preview Window)

找着根源,那解决方案的切入口就是整个APP的Manifest文件,更确切的说应该是主题配置文件Android在选择展示黑屏或者白屏的时候,是根据你设定的主题而不同的,也就是说,虽然你的代码没有被执行,你的配置文件却被提前读取了,用来作为展示Preview Window界面的依据 –这就是自定义Preview Window。

3.1 配置Theme

在“style.xlm”文件中,添加如下主题:

    <style name="StartAppTheme" parent="AppTheme">
        <item name="android:windowBackground">@drawable/ic_bg</item>
    </style>

3.2 配置Activity的主题

将主题设置到启动的Activity的主题中,WindowBackground就是即将展示的Preview Window。其中ic_bg可以是一整张图片,其实它也可以是一个能解析出图片资源的XML文件:

    <activity
        android:name=".activity.SplashActivity"
        android:screenOrientation="portrait"
        android:theme="@style/StartAppTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

这样设置之后,当你点击APP,会立马进入你配置的界面,然后启动欢迎页。



3.3 背景图设置为空

启动页做到这基本可以交货了,不过还有一个小问题需要处理,那就是在给Preview Window设置的背景图如果不做处理,图片就会一直存在于内存中,所以,当进入到欢迎页的时候,不要忘了把背景图设置为空:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //将window的背景图设置为空
        getWindow().setBackgroundDrawable(null);
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
            finish();
            return;
        }
        if (SharePreferecnceUtils.getFirstLauncher() == 0) {
            PrivacyDialogFragment fragment = new PrivacyDialogFragment();
            fragment.show(getSupportFragmentManager(), "");
        } else {
            goToMainActivity();
        }
    }

好了,到这里,关于Android启动页白(黑)屏的问题就解决了。

四、扩展

在这里需要明确一点的是,Preview Window只能是静态图,它本身是不展示动画的,为了有更好的体验,当界面从 Preview Window 跳转到 欢迎页 的时候,欢迎页必须首先展示一个和Preview Window一模一样的界面,让人看起来好像界面还没切换一样,然后再慢慢切换到欢迎页,在进入欢迎页之后的展示一些动画。