求助: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




