通过设置Activity的Theme来优化App启动白屏问题

Posted 怪兽N

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过设置Activity的Theme来优化App启动白屏问题相关的知识,希望对你有一定的参考价值。

通过设置Activity的Theme来优化App启动白屏问题

简介

App冷启动时,系统会立刻加载AppTheme设置的WindowBackground, 但是系统主题默认白屏(Light)或者黑屏(Dark),然后才开始走App的启动流程,所以跟据情况如果冷启动Application的onCreate()比较耗时就会看到白白屏比较久。所以有以下几种方法:
1 Application.onCreate();
2 先设置启动ActivityWindowBackground为透明,然后再设置回主题颜色
3 可以设置启动Activity的Theme为我们App主题的图片或颜色,这样就不是白屏了,给用户的感觉就是已经加载了。
方案1根据App本身业务定,本文不展开。第2、3种方案类似,本文以第3种方案实践。即设置启动Activity的Theme为我们App主题的图片或颜色。

项目地址:https://gitee.com/guaishoun/splash_activity.git

优化步骤

定义启动页style

首先,先定义一个res/values/styles.xml中添加style

    <style name="SplashTheme" parent="AppTheme.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_bg</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowTranslucentStatus">true</item>
		<!-- values-v23-->
        <item name="android:windowLightStatusBar">false</item>
        
        <!-- 设置activity的切换效果 -->
        <!--<item name="android:windowActivityTransitions">true</item>-->
        <!--<item name="android:windowEnterTransition">@android:transition/explode</item>-->
        <!--<item name="android:windowExitTransition">@android:transition/explode</item>-->
    </style>

其中‘@drawable/splash_bg’为layout-list

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@color/colorAccent"/>
    <item
        android:gravity="center"
        android:drawable="@drawable/image_category_entertainment_raster"/>
</layer-list>

**注意:**因为冷启动时,系统启动默认启动页上述变化 ‘transition’ 效果不能起作用,但是可以用在SplashActivity的退出及MainAcitivity的进入上。另外,这时启动activity需要下面这样, 否则看不到设置的效果

Intent intent = new Intent(SplashActivity.this,MainActivity.class);
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());           

设置启动页style

然后,在AndroidManifest.xml里为默认启动Activity设置style

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

启动MainActivity

最后,如果Activity的有内容和背景,把背景设置会白色背景

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        View view = getWindow().getDecorView();
        int startDelay = 1000;
        view.postDelayed(() -> {
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);
            startActivity(intent);
            view.postDelayed(this::finish, 1000);
        }, startDelay);
    }

总结

这个方案是从感官上给用户感觉已经加载出东西了,虽然实质上不是实质的性能优化,但是效果还是很好的。

以上是关于通过设置Activity的Theme来优化App启动白屏问题的主要内容,如果未能解决你的问题,请参考以下文章

安卓 Activity主题theme设置

AlertDialog.java

Android Studio:You need to use a Theme.AppCompat theme (or descendant) with this activity. AlertDial

单独设置Activity的Theme

弹出AlertDialog的时候报You need to use a Theme.AppCompat theme (or descendant) with this activity错误

activity theme parent 属性浅析