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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:18:40