Android 12使用SplashScreen API的setSplashScreenTheme覆盖启动屏默认Logo失败
Android动态覆盖启动屏Logo的实现说明
核心结论
原生Android 12+系统自带的SplashScreen API 不支持运行时动态修改默认Logo,原因是系统启动应用的过程中,会在应用进程创建、业务代码执行前,就提前读取Manifest中配置的主题参数完成启动屏渲染,代码中调用setSplashScreenTheme的时机远晚于系统渲染阶段,因此不会生效。
官方SplashScreen库可实现动态修改的原因
你提到的集成Jetpack官方SplashScreen库后可覆盖的逻辑,是因为该库没有依赖系统级的启动屏渲染流程,而是在应用进程启动后、主界面渲染前,接管启动屏的显示逻辑,此时应用代码已经可以正常执行,因此动态修改的配置可以生效。
动态修改启动屏Logo的正确实现方案
- 必须依赖Jetpack SplashScreen库,首先在gradle中引入依赖:
implementation "androidx.core:core-splashscreen:1.0.1" - Manifest中仅配置基础的默认启动主题,父主题指向库提供的
Theme.SplashScreen系列即可 - 在启动Activity的
super.onCreate()执行前,完成库的初始化和动态配置:// 初始化SplashScreen val splashScreen = installSplashScreen() // 方式1:动态设置自定义主题 splashScreen.setSplashScreenTheme(R.id.YourCustomSplashTheme) // 方式2:更灵活的动态设置图标,无需预先定义主题 splashScreen.setIconProvider { // 直接返回你需要的动态Drawable,支持根据业务逻辑切换不同图标 getDrawable(R.drawable.your_dynamic_logo) }
注意:targetSdk和compileSdk设为31及以上是使用该库的基础要求,配置完成后不要同时保留原生系统SplashScreen的相关自定义配置,避免冲突。
内容的提问来源于stack exchange,提问作者MGK
相关产品推荐
相关产品推荐

