Android 12以下版本SplashScreen API跳转黑屏问题求助
解决Android 12以下SplashScreen跳转前黑屏问题
问题原因
- 启动画面未完成过渡就强制跳转:你的代码在
onCreate中直接调用startActivity和finish,此时SplashScreen的退出动画还未执行完成,系统无法及时切换到目标Activity,导致短暂黑屏。 setKeepOnScreenCondition使用逻辑冲突:设置{ true }会让启动画面持续保留,但你未在合适时机释放这个条件就结束Activity,直接造成画面断层。
解决方案
1. 修正SplashActivity逻辑,等待启动画面过渡完成再跳转
修改SplashActivity代码,通过监听启动画面退出动画回调,确保过渡完成后再执行跳转操作:
class SplashActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // 标记是否准备好跳转 var isJumpReady = false // 保留启动画面直到跳转准备完成 splashScreen.setKeepOnScreenCondition { !isJumpReady } // 确定目标页面Intent val targetIntent = if (sharedPreferenceUtils.preferenceGetBoolean(Utils.PreferenceKey.isLoggedIn, false)) { Intent(this@SplashActivity, HomeActivity::class.java) } else { Intent(this@SplashActivity, LoginActivity::class.java) } // 监听启动画面退出动画,完成后执行跳转 splashScreen.setOnExitAnimationListener { splashView -> splashView.animate() .alpha(0f) .setDuration(splashView.iconAnimationDurationMillis) .withEndAction { splashView.remove() startActivity(targetIntent) finish() } // 标记为准备完成,触发启动画面退出逻辑 isJumpReady = true } } }
2. 调整主题配置
移除AppTheme中的android:windowDisablePreview="true"属性,该属性会关闭Activity启动前的预览窗口,加剧黑屏现象:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <!-- 移除该行,避免关闭启动预览窗口 --> <!-- <item name="android:windowDisablePreview">true</item> --> <item name="android:windowContentTransitions">true</item> <item name="android:navigationBarColor">@color/primaryDark</item> <item name="colorPrimary">@color/primary</item> <item name="colorAccent">@color/primary</item> <item name="colorPrimaryDark">@color/primary</item> <item name="android:forceDarkAllowed">true</item> </style>
同时,建议保持values-31和主themes.xml中Theme.CustomSplashScreenTheme的背景色、图标风格统一,避免过渡时出现视觉突兀。
3. 确认依赖配置
确保Module级别的build.gradle中引入了SplashScreen兼容库(Android 12以下版本必需):
dependencies { // SplashScreen 兼容库 implementation "androidx.core:core-splashscreen:1.0.1" // 其他项目依赖... }
原理说明
通过setKeepOnScreenCondition让启动画面保留到跳转逻辑准备完成,再通过setOnExitAnimationListener监听退出动画流程,在动画结束后再启动目标Activity并关闭当前页面,确保画面过渡流畅,彻底解决黑屏问题。
内容的提问来源于stack exchange,提问作者primo
相关产品推荐
相关产品推荐

