某天我照常开发新应用时,在我的闪屏页SplashActivity中发现一个warning提示:The application should not provide its own launch screen。
于是查阅了相关资料发现,google已不再建议SplashActivity+MainActivity这样的启动流程了,而是更改为只有一个MainActivity,在MainActivity中先展示闪屏页面,待加载完毕后展示主页面
使用方法
首先添加splash screen依赖
scss
dependencies {
implementation("androidx.core:core-splashscreen:1.0.1")
}
接下来要定义一个Splash Theme主题,在styles.xml中添加定义
ini
<style name="Theme.Splash" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash</item>
<item name="android:windowBackground">@color/background</item>
<item name="android:windowFullscreen">true</item>
<item name="android:windowSplashScreenBrandingImage">@drawable/...</item>
<item name="postSplashScreenTheme">@style/Theme.YourTheme</item>
</style>
其中,postSplashScreenTheme需要替换为后续的Activity主题,这个主题将在闪屏页结束后生效
在app的Manifest文件中把MainActivity的主题声明为该Splash主题
ini
<activity
android:name=".ui.MainActivity"
android:exported="true"
android:theme="@style/Theme.Splash" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
最后,在MainActivity中,需要在onCreate方法中调用installSplashScreen方法,这个方法应该尽早调用,以更早地显示闪屏内容。如果需要在展示首页内容前进行一些加载,可以通过splash.setKeepOnScreenCondition方法设置条件
kotlin
override fun onCreate(savedInstanceState: Bundle?) {
val splash = installSplashScreen()
super.onCreate(savedInstanceState)
var isLoading by mutableStateOf(true)
lifecycleScope.launch {
// ...
isLoading = false
}
splash.setKeepOnScreenCondition { isLoading }
setContent {
// ...
}
}
设置完成后,启动应用就可以得到闪屏效果了
兼容问题
虽然google宣称SplashScreen
API是支持Android11及以前版本的,但是在测试中仍发现了部分机型(如moto)的闪屏效果不生效。为了解决该兼容问题,定义了两套Splash的主题,Android12以上版本使用新的Splash Theme,放在v31/styles.xml中,旧版本则使用传统的Theme,定义如下
ini
<style name="Theme.Splash" parent="YourAppTheme">
<item name="android:windowBackground">@drawable/splash_background</item>
<item name="android:windowFullscreen">true</item>
</style>
其中splash_backgroud.xml定义为
xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/background" />
<item
android:drawable="@drawable/ic_splash"
android:gravity="center" />
</layer-list>