You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12以下版本SplashScreen API跳转黑屏问题求助

解决Android 12以下SplashScreen跳转前黑屏问题

问题原因

  1. 启动画面未完成过渡就强制跳转:你的代码在onCreate中直接调用startActivity和finish,此时SplashScreen的退出动画还未执行完成,系统无法及时切换到目标Activity,导致短暂黑屏。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:25:21