You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:Admob插屏广告仅首次点击显示,返回主活动后无广告

解决AdMob插屏广告仅首次点击显示的问题

嘿,我之前也碰到过一模一样的问题!核心原因很简单:AdMob的插屏广告实例只能被展示一次,第一次展示后这个实例就失效了,而你回到主页面后没有重新请求新的广告,所以第二次点击时根本没有可用的广告可以显示。下面是具体的修复方案:

1. 重构广告加载逻辑:让广告“用完即补”

我们需要保证每次用户可能点击按钮时,都有一个已加载完成的广告实例待命。所以要在这些时机重新加载广告:

  • 主Activity启动时(首次加载)
  • 广告展示完成后(不管用户是关闭广告还是广告跳转)
  • 从目标Activity返回主Activity时(兜底加载)

代码示例(Android Kotlin)

首先在MainActivity中定义核心变量:

private var interstitialAd: InterstitialAd? = null
// 用来记录用户点击的目标Activity,广告关闭后跳转
private var targetActivity: Class<*>? = null
private val adRequest = AdRequest.Builder().build()

然后写一个通用的广告加载方法:

private fun loadInterstitialAd() {
    // 如果已有可用广告,就不重复请求,避免浪费配额
    if (interstitialAd != null) return

    InterstitialAd.load(this, "你的测试插屏广告ID", adRequest,
        object : InterstitialAdLoadCallback() {
            override fun onAdLoaded(ad: InterstitialAd) {
                interstitialAd = ad
                // 设置广告生命周期回调,关键在这里!
                ad.fullScreenContentCallback = object : FullScreenContentCallback() {
                    override fun onAdDismissedFullScreenContent() {
                        // 用户关闭广告后,立刻重新加载下一个广告
                        interstitialAd = null
                        loadInterstitialAd()
                        // 跳转到用户之前点击的目标页面
                        targetActivity?.let {
                            startActivity(Intent(this@MainActivity, it))
                            targetActivity = null
                        }
                    }

                    override fun onAdFailedToShowFullScreenContent(error: AdError) {
                        // 广告展示失败,同样重新加载
                        interstitialAd = null
                        loadInterstitialAd()
                        // 展示失败就直接跳转
                        targetActivity?.let {
                            startActivity(Intent(this@MainActivity, it))
                            targetActivity = null
                        }
                    }
                }
            }

            override fun onAdFailedToLoad(error: LoadAdError) {
                interstitialAd = null
                Log.d("AdMobDebug", "广告加载失败: ${error.message}")
            }
        }
    )
}

2. 在合适的时机触发加载

  • 在MainActivity的onCreate方法中调用loadInterstitialAd(),完成首次广告加载
  • 为了防止从目标页面返回时广告已失效,在onResume中也兜底检查并加载:
override fun onResume() {
    super.onResume()
    // 如果当前没有可用广告,就重新加载
    if (interstitialAd == null) {
        loadInterstitialAd()
    }
}

3. 修改按钮点击事件逻辑

现在每次点击按钮时,先判断是否有可用广告:

// 以第一个按钮为例,其他按钮逻辑完全一致
btn1.setOnClickListener {
    targetActivity = TargetActivity1::class.java
    interstitialAd?.let { ad ->
        // 有可用广告,先展示
        ad.show(this)
    } ?: run {
        // 没有可用广告,直接跳转,同时触发广告加载
        startActivity(Intent(this, TargetActivity1::class.java))
        loadInterstitialAd()
    }
}

关键注意事项

  • 用测试广告单元:确保你使用的是AdMob官方提供的测试ID,比如插屏测试ID为ca-app-pub-3940256099942544/1033173712,不要用正式ID测试,否则可能会被AdMob限制请求。
  • 避免重复请求:加载广告前先检查interstitialAd是否为null,防止不必要的广告请求,节省配额。
  • 权限配置:确认AndroidManifest.xml中已经添加了AdMob应用ID配置和网络权限(android.permission.INTERNET)。

这样修改后,每次点击按钮都会优先展示已加载的广告,广告关闭后自动跳转目标页面,同时立刻加载下一个广告;如果没有可用广告就直接跳转并触发加载,保证下一次点击能正常显示广告。

内容的提问来源于stack exchange,提问作者Arman Hossain

火山引擎 最新活动