通过设置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启动白屏问题的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio:You need to use a Theme.AppCompat theme (or descendant) with this activity. AlertDial
弹出AlertDialog的时候报You need to use a Theme.AppCompat theme (or descendant) with this activity错误