通过设置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);
}
这个方案是从感官上给用户感觉已经加载出东西了,虽然实质上不是实质的性能优化,但是效果还是很好的。