切后台返回后AdMob插屏广告关闭时StartActivity延迟启动问题
问题核心诱因
插屏广告关闭后新Activity启动延迟,是任务栈状态错位叠加Android系统后台启动限制导致的,具体逻辑:
- 插屏广告本质是压在应用任务栈栈顶的独立广告Activity。广告展示过程中按Home键退回桌面时,整个应用任务栈会被系统切到后台,此时关闭广告触发
onAdDismissedFullScreenContent回调的时机,你的宿主Activity已经处于非前台的STOPPED/STARTED状态。 - Android 10及以上版本默认对后台应用启动Activity做了严格限制:非前台状态下发出的
startActivity请求不会被立即执行,会被系统加入待调度队列,等应用任务栈重新回到前台后才会按顺序处理,这就是数秒延迟的核心来源。 - 原回调中同时调用
startActivity和finish(),系统恢复任务栈时需要先处理原宿主Activity的销毁事务,再调度新Activity的启动,两个栈操作排队会进一步拉长延迟时长;加上从最近任务恢复时系统会优先完成广告Activity的出栈、关闭动画,再处理待执行的启动请求,最终表现为新Activity延迟数秒才展示。
验证方法
在onAdDismissedFullScreenContent回调中打印当前Activity的生命周期状态:正常场景下回调触发时宿主Activity处于RESUMED前台状态,启动请求会被系统立即执行;复现异常场景时,回调触发时宿主Activity生命周期状态低于RESUMED,启动请求会被系统延迟调度。
修复实现
通过标记位把跳转逻辑延后到宿主Activity回到前台的onResume时机执行即可彻底解决延迟问题,代码如下:
// 宿主Activity中添加跳转标记位 private var needNavigateToNewPage = false override fun onAdDismissedFullScreenContent() { if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) { // 前台状态直接执行跳转 startActivity(Intent(this, NewActivity::class.java)) finish() } else { // 后台状态先打标记,等回到前台再跳转 needNavigateToNewPage = true } } override fun onResume() { super.onResume() if (needNavigateToNewPage) { needNavigateToNewPage = false startActivity(Intent(this, NewActivity::class.java)) finish() } }
内容的提问来源于stack exchange,提问作者code4rox
相关产品推荐
相关产品推荐

