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>
相关推荐
执明wa2 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder2 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农2 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户69371750013843 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr4 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
sg_knight4 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
爱笑鱼4 小时前
Binder(四):ioctl(BINDER_WRITE_READ) 之后,事务怎样到达目标进程?
android
AFinalStone4 小时前
Android 7系统休眠唤醒(二)开机全链路—BootROM到Launcher
android·电源管理·休眠唤醒
Mr YiRan4 小时前
Android NDK开发之统计到未被回收的图片
android