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

Android 12下SplashScreen库启动页不显示及动画监听失效求助

问题分析与解决方案

核心问题点

  1. 回调逻辑冲突:同时使用setKeepOnScreenCondition和setOnExitAnimationListener会触发逻辑矛盾——前者满足条件后会直接移除启动页,跳过后者的退出动画监听,这是你遇到回调被忽略的核心原因。
  2. 重新安装后的系统状态异常:应用处于前台时重新安装,Android系统启动流程会进入特殊状态,可能导致SplashScreen的生命周期回调未正常触发。
  3. 无效动画实现:你的退出动画是ALPHA从1f到1f,无实际动画效果,且未在动画结束后调用splashScreenView.remove(),易引发视图残留或逻辑异常。
  4. 错误的跳转时机:在setKeepOnScreenCondition回调中直接启动MainActivity并finish(),违背了该回调仅用于判断是否保持启动页显示的设计初衷,会导致逻辑混乱。

解决方案步骤

1. 移除冲突回调,聚焦退出动画逻辑

删除setKeepOnScreenCondition相关代码,仅通过setOnExitAnimationListener控制启动页退出与页面跳转。

2. 修复退出动画实现

设置有效的动画效果,并确保动画结束后正确移除启动页视图,再执行页面跳转。

3. 添加兜底逻辑,覆盖重新安装异常场景

在onResume中添加超时判断,防止因回调未触发导致应用卡在空白页。

4. 升级SplashScreen库版本

将依赖升级到最新稳定版(如androidx.core:core-splashscreen:1.0.1或更高),官方可能已修复重新安装场景下的兼容性问题。

修改后的代码示例

class SplashActivity : AppCompatActivity() {
    private var isMainActivityLaunched = false

    override fun onCreate(savedInstanceState: Bundle?) {
        // 必须在super.onCreate之前调用installSplashScreen
        val splashScreen = installSplashScreen()
        super.onCreate(savedInstanceState)

        splashScreen.setOnExitAnimationListener { splashScreenView ->
            // 设置渐隐退出动画
            val fadeOut = ObjectAnimator.ofFloat(
                splashScreenView.iconView,
                View.ALPHA,
                1f, 0f
            )
            fadeOut.duration = 500L

            fadeOut.doOnEnd {
                splashScreenView.remove() // 必须移除启动页视图
                launchMainActivity()
            }

            fadeOut.start()
        }
    }

    override fun onResume() {
        super.onResume()
        // 兜底逻辑:1.5秒内未启动MainActivity则直接跳转
        if (!isMainActivityLaunched) {
            Handler(Looper.getMainLooper()).postDelayed({
                if (!isMainActivityLaunched) {
                    launchMainActivity()
                }
            }, 1500)
        }
    }

    private fun launchMainActivity() {
        if (!isMainActivityLaunched) {
            isMainActivityLaunched = true
            startActivity(Intent(this, MainActivity::class.java))
            finish()
        }
    }
}

额外注意事项

  • 启动模式配置:确保SplashActivity的启动模式为singleTask,避免重复创建实例(在AndroidManifest.xml中设置):
    <activity
        android:name=".SplashActivity"
        android:launchMode="singleTask"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    
  • 避免耗时操作:初始化逻辑建议放在MainActivity或单独线程中,不要阻塞SplashScreen的生命周期回调。

内容的提问来源于stack exchange,提问作者LuzLaura98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:57:21