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>
相关推荐
YB13759 分钟前
Jetpack Compose 动画animate*AsState
android
高晶12 分钟前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
隐擎fox1 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
换元不配限3 小时前
从 AsyncTask 到现代并发:Android 异步方案的演进与替代实践
android·asynctask·异步编程·方案对比·asynctask替代方案
用户2018792831673 小时前
你的 App 为什么是「电量刺客」?——从一条 WakeLock 追到 Linux 内核的 Android 省电原理全解
android
mmsx3 小时前
Android 安全校验下沉到原生层:防 patch 与构建期自动化
android·安全·自动化
老牛日常随笔5 小时前
Google把Android测试搬进AI对话:ARTEMIS如何用自然语言操作你的手机
android·人工智能·智能手机
朱涛的自习室5 小时前
预算 1000 美金的开源软件,DeepSeek 只花 1 美金就做完了(Day 6)
android·前端·人工智能
mmsx6 小时前
Android APK 加固方案怎么落地:从加壳到校验的组合取舍
android·网络·安全·签名