AdMob激励视频切换Activity后无法再次展示问题
嘿,这个问题我之前帮好几个开发者排查过,大概率是激励视频广告没有在返回MainActivity后重新加载导致的!咱们一步步拆解解决:
问题根源分析
最常见的情况是你只在MainActivity的onCreate()里初始化并加载了一次激励视频。当用户看完广告进入RoomOne再返回时,之前的广告实例已经被消耗掉(展示过的广告不能重复调用展示),但你没有重新触发加载逻辑,所以再次点击按钮时没有可用的广告可以展示。
具体解决方案
1. 重构广告加载逻辑,确保返回后自动重试
把广告加载的代码抽成独立方法,然后在两个关键时机调用:
- 应用启动时(
onCreate()) - 从RoomOne返回MainActivity时(
onResume())
示例Kotlin代码(Java逻辑完全一致):
private var rewardedAd: RewardedAd? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 首次加载广告 loadRewardedAd() // 按钮点击事件 findViewById<Button>(R.id.btn_enter_room).setOnClickListener { showRewardedAd() } } override fun onResume() { super.onResume() // 返回主页面后,检查广告是否可用,不可用就重新加载 if (rewardedAd == null || !rewardedAd!!.isLoaded) { loadRewardedAd() } } private fun loadRewardedAd() { val adRequest = AdRequest.Builder().build() RewardedAd.load(this, "你的广告ID", adRequest, object : RewardedAdLoadCallback() { override fun onAdLoaded(ad: RewardedAd) { rewardedAd = ad // 可选:加载成功后让按钮可点击,提升用户体验 findViewById<Button>(R.id.btn_enter_room).isEnabled = true } override fun onAdFailedToLoad(loadAdError: LoadAdError) { rewardedAd = null // 加载失败提示用户,或自动重试 Toast.makeText(this@MainActivity, "广告加载中,请稍后", Toast.LENGTH_SHORT).show() } }) } private fun showRewardedAd() { rewardedAd?.let { ad -> ad.show(this) { rewardItem -> // 奖励逻辑:跳转到RoomOne startActivity(Intent(this, RoomOne::class.java)) // 广告展示后立即置空,避免重复使用 rewardedAd = null // 同时禁用按钮,等待下一次加载完成 findViewById<Button>(R.id.btn_enter_room).isEnabled = false } } ?: run { Toast.makeText(this, "广告还没加载好哦", Toast.LENGTH_SHORT).show() // 手动触发一次加载 loadRewardedAd() } }
2. 严格管理广告实例生命周期
- 广告展示完成后必须把
rewardedAd置空,因为用过的实例无法再次调用show() - 在
onDestroy()里销毁广告实例,避免内存泄漏:
override fun onDestroy() { super.onDestroy() rewardedAd = null }
3. 优化用户交互反馈
建议在按钮上做状态提示:
- 广告加载中时,按钮置灰并显示“加载中”
- 广告加载完成后,恢复按钮可点击状态并显示“观看广告进入”
额外注意事项
- 务必使用AdMob的测试广告ID进行调试,避免触发真实广告的展示限制
- 确保你的AdMob SDK是最新版本,旧版本可能存在生命周期相关的bug
内容的提问来源于stack exchange,提问作者EpicDragon 68
相关产品推荐
相关产品推荐

