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

自定义SplashScreen调试模式下setOnExitAnimationListener不触发问题

问题解决方案

根因说明

该差异由Android Studio调试安装应用的默认拉起逻辑导致:AS调试时会直接通过adb命令唤起目标Activity,跳过了桌面启动器触发的标准应用冷启动流程,早期alpha版的splashscreen依赖对该场景的兼容性存在缺陷,因此不会触发启动页渲染和退出回调。

可落地解决步骤

  • 第一步:升级splashscreen依赖到稳定版
    你当前使用的1.0.0-alpha01是非常早期的预览版本,存在大量已知兼容性问题,替换依赖为最新稳定版即可解决90%的场景异常:
    implementation "androidx.core:core-splashscreen:1.0.1"
    
  • 第二步:修改Android Studio运行配置
    调整AS的启动逻辑,让调试时也走标准的桌面启动流程:
    1. 打开顶部菜单 Run -> Edit Configurations
    2. 选中你的app模块对应的运行配置
    3. 在Launch Options分类下,将Launch属性从默认的Default Activity改为Nothing
    4. 保存配置后重新调试,安装应用后手动点击桌面图标进入(和用户实际使用场景完全一致),即可复现正常的启动页逻辑
  • 第三步:增加兜底路由逻辑,避免页面卡住
    不管启动页回调是否触发,都增加超时兜底机制防止页面停留,参考代码如下:
    class SplashActivity : AppCompatActivity() {
        private val routerDelayJob = Job()
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val splashScreen = installSplashScreen()
            var hasRouter = false
            splashScreen.setOnExitAnimationListener { 
                if (!hasRouter) {
                    hasRouter = true
                    routerDelayJob.cancel()
                    routeToOtherActivity()
                }
            }
            // 兜底超时:1.5秒后不管回调有没有触发都走路由逻辑,可根据业务调整时长
            lifecycleScope.launch(routerDelayJob) {
                delay(1500)
                if (!hasRouter) {
                    hasRouter = true
                    routeToOtherActivity()
                }
            }
        }
    }
    
  • 第四步:检查清单文件配置
    确认SplashActivity在AndroidManifest.xml中配置的启动主题正确继承自Theme.SplashScreen系列,且没有额外配置会拦截启动页渲染的window属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:24:03