Android适配最新SplashScreen方案

某天我照常开发新应用时,在我的闪屏页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>
相关推荐
峥嵘life13 小时前
2026免费的 opencode 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言
杉氧13 小时前
拒绝重复造轮子:我写了一个生产级的 Kotlin 协程与 Flow 工具库(CoroutineKit)
android·kotlin·workflow
恋猫de小郭14 小时前
Flutter GSoC 2026 提案进度解读,补上 DevTools、FFI 和原生平台的关键缺口
android·前端·flutter
2501_9159090614 小时前
怎么用 FlutterFlow 把应用发布到 App Store?
android·ios·小程序·https·uni-app·iphone·webview
峥嵘life14 小时前
2026华为AI码道 CodeArts 使用分享:Windows端 + 服务器CLI 实战总结
android·大数据·开发语言·python
yxlalm14 小时前
对话记忆持久化-Redis热与MySQL冷
android·redis·mysql
157092511341 天前
Android进阶之光:HTTP协议原理深度解析
android·网络协议·http
终端安全笔记1 天前
安卓五品牌通道差在哪:监管通道拆解
android
v_34836087621 天前
Android native端 堆栈打印
android·算法