Android 12多Activity应用自定义SplashScreen重复展示问题如何解决
解决方案
问题根因
你遇到的重复显示、温启动不生效问题核心来自两个原因:
- 你使用的1.0.0-alpha01属于早期测试版本,存在大量已知兼容性bug
- 额外新增独立SplashActivity的实现方式不符合SplashScreen API的设计逻辑,多Activity重复调用
installSplashScreen()自然会导致每次Activity启动都触发一次启动页绘制
能否直接用系统SplashScreen API实现需求
可以。如果你的应用最小兼容版本为Android 12(API 31)及以上,直接用系统原生API就能实现需求,逻辑和Androidx compat库完全一致,不需要引入额外依赖。如果需要兼容Android 12以下的设备,优先使用稳定版Androidx SplashScreen compat库,它会在低版本自动模拟和系统一致的启动页行为。
正确实现步骤(兼容全版本,和系统默认启动页行为完全一致)
1. 升级依赖
首先把1.0.0-alpha01版本的SplashScreen compat库替换为最新稳定版:
implementation "androidx.core:core-splashscreen:1.0.1"
2. 移除独立的SplashActivity
SplashScreen API不需要单独的启动页Activity,直接在入口Activity配置即可,避免跳转触发重复绘制。
3. 全局配置自定义启动页主题
在应用的主主题中配置自定义的图标和背景:
<style name="AppTheme" parent="Theme.SplashScreen"> <!-- 启动页背景色 --> <item name="windowSplashScreenBackground">@color/your_bg_color</item> <!-- 自定义启动页图标,支持静态/动图 --> <item name="windowSplashScreenAnimatedIcon">@drawable/your_custom_icon</item> <!-- 启动页消失后应用使用的正常主题 --> <item name="postSplashScreenTheme">@style/YourAppNormalTheme</item> </style>
并将这个主题设置为你应用的android:theme属性值。
4. 仅在入口Activity调用初始化方法
只需要在应用的入口Activity(通常是MainActivity)的onCreate方法中,super.onCreate执行前调用installSplashScreen()即可,其他所有Activity不需要调用该方法:
override fun onCreate(savedInstanceState: Bundle?) { val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // 可选:控制启动页保留时长,比如等应用初始化完成再消失 splashScreen.setKeepOnScreenCondition { !appInitFinished() } setContentView(R.layout.activity_main) }
按上述配置后,不管冷启动、温启动场景,系统都会自动展示一次自定义启动页,Activity跳转不会触发重复显示,行为和系统默认SplashScreen完全一致,仅图标、背景为你自定义的内容。
内容的提问来源于stack exchange,提问作者Linh
相关产品推荐
相关产品推荐

