自定义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的启动逻辑,让调试时也走标准的桌面启动流程:- 打开顶部菜单
Run->Edit Configurations - 选中你的app模块对应的运行配置
- 在
Launch Options分类下,将Launch属性从默认的Default Activity改为Nothing - 保存配置后重新调试,安装应用后手动点击桌面图标进入(和用户实际使用场景完全一致),即可复现正常的启动页逻辑
- 打开顶部菜单
- 第三步:增加兜底路由逻辑,避免页面卡住
不管启动页回调是否触发,都增加超时兜底机制防止页面停留,参考代码如下: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
相关产品推荐
相关产品推荐

