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>
相关推荐
Chrome深度玩家2 小时前
谷歌翻译安卓版拍照翻译精准度与语音识别评测【轻松交流】
android·人工智能·语音识别
长点点2 小时前
从架构角度了解安卓APP(1):安卓核心组件的设计逻辑与演进
android·架构·app
EQ-雪梨蛋花汤3 小时前
【Part 2安卓原生360°VR播放器开发实战】第二节|基于等距圆柱投影方式实现全景视频渲染
android·音视频·vr
Railshiqian3 小时前
Framework.jar里的类无法通过Class.forName反射某个类的问题排查
android·反射·framework.jar
鸿蒙布道师4 小时前
鸿蒙NEXT开发正则工具类RegexUtil(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
Anger重名了5 小时前
🌟 一篇文章搞懂Kotlin协程:比线程更轻量的并发神器
android
缘来的精彩5 小时前
adb常用的20个命令
android·adb·kotlin
tangweiguo030519875 小时前
Android kotlin通知功能完整实现指南:从基础到高级功能
android·kotlin