通过设置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">
        "android:windowBackground">@drawable/splash_bg
        "android:windowFullscreen">true
        "android:windowTranslucentStatus">true
		
        "android:windowLightStatusBar">false
        
        
        
        
        
    style>

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


<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);
    }

总结

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

你可能感兴趣的:(随笔,Android性能优化,android,安卓,java)