如何正确实现不依附应用进程的Android Splash启动屏
问题1:属性无法解析报错的解决方法
Cannot resolve symbol 'android:windowSplashScreenBackground'报错的根本原因是这些属性为Android 12(API等级31)新增的系统级属性,解决方案分两种场景:
- 若应用仅需适配Android 12及以上版本,直接将模块级
build.gradle中的compileSdkVersion升级到31及以上,IDE即可自动识别对应属性。 - 若需要兼容更低Android版本,不可直接使用原生系统属性,需引入Jetpack官方提供的SplashScreen兼容库。
问题2:替代实现方案
主流无黑屏的启动屏实现有两种,均不需要单独编写延时跳转的SplashScreenActivity:
方案1:Jetpack SplashScreen兼容库(推荐)
可兼容到Android 6.0(API 23),和系统原生启动屏逻辑完全一致:
- 先在模块级
build.gradle添加依赖:
dependencies { implementation "androidx.core:core-splashscreen:1.0.1" }
- 新增启动专用主题,不再使用
android:开头的原生属性,改用兼容库属性:
<style name="Theme.Books.Splash" parent="Theme.SplashScreen"> <item name="windowSplashScreenBackground">@color/black</item> <item name="windowSplashScreenAnimatedIcon">@drawable/books_logo</item> <item name="windowSplashScreenAnimationDuration">1000</item> <item name="postSplashScreenTheme">@style/Theme.Books</item> </style>
- 将AndroidManifest.xml中主启动Activity的主题设置为
Theme.Books.Splash,之后在主Activity的onCreate方法的super.onCreate调用前添加installSplashScreen()即可:
override fun onCreate(savedInstanceState: Bundle?) { val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // 原有业务逻辑无需修改 }
方案2:传统窗口背景方案(全版本兼容)
若需要兼容Android 6.0以下版本,可使用这套经过长期验证的方案:
- 新建启动专用主题,设置窗口背景为启动屏素材:
<style name="Theme.Books.Launcher" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <item name="android:windowBackground">@drawable/launcher_background</item> <item name="android:statusBarColor">@color/black</item> </style>
- 主启动Activity在Manifest中使用该启动主题,之后在
onCreate的super.onCreate执行后、setContentView执行前切回正常应用主题:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setTheme(R.style.Theme_Books) setContentView(R.layout.activity_main) }
这套方案下,系统加载应用进程时会直接显示设置的windowBackground,完全不会出现黑屏,和Google Play Store、WhatsApp的实现逻辑一致。
问题3:遗漏配置与进程分离相关说明
- 遗漏的核心配置是未将
compileSdkVersion升级到31及以上,也未引入Jetpack兼容库,因此IDE无法识别Android 12新增的启动屏属性。 - 不存在将启动屏Activity与应用进程分离的方案,之前遇到的黑屏问题,本质是自定义的SplashScreenActivity需要等待应用进程初始化完成、Activity执行到onCreate的setContentView才会渲染布局,而系统层面的窗口背景是在进程加载阶段就由系统直接绘制,不需要等待应用进程初始化完成,因此不会出现黑屏。无需单独编写SplashScreenActivity,使用上述两种方案直接给主Activity配置启动主题即可,既没有黑屏问题,也不会存在跳转闪屏的体验缺陷。
内容的提问来源于stack exchange,提问作者Ronnie
相关产品推荐
相关产品推荐

