
admob插页广告加载后仅在1小时内有效,超时未展示将导致曝光不被计费;开发者需在过期前主动刷新广告实例,避免无效调用和收益损失。
在使用 com.google.android.gms.ads.interstitial.InterstitialAd 实现插页广告时,一个常见但易被忽视的关键点是:广告对象并非长期有效。即使 mInterstitialAd != null,也不代表该广告仍可正常展示并产生有效曝光。
根据 Google AdMob 官方文档(Interstitial Ads – Best Practices),预加载的插页广告有效期为 60 分钟。超过此时间后:
- 调用 show() 方法可能无响应或触发静默失败;
- 即使广告成功弹出,该次曝光不会被 AdMob 计入有效展示(impression),从而影响填充率、eCPM 及最终收益;
- 系统不会主动抛出异常或回调提示过期,开发者需自行管理生命周期。
✅ 正确做法:实现定时刷新机制
推荐在广告加载成功后启动一个倒计时任务(如 Handler 或 CountDownTimer),在 55–58 分钟时主动发起新一轮广告请求,并在新广告加载完成后替换旧实例:
private InterstitialAd mInterstitialAd;
private static final long AD_EXPIRY_MS = 60 * 60 * 1000; // 1 hour
private Handler refreshHandler = new Handler(Looper.getMainLooper());
private Runnable refreshRunnable;
public void loadInterstitialAd() {
InterstitialAd.load(this, "YOUR_AD_UNIT_ID", new AdRequest.Builder().build(),
new InterstitialAdLoadCallback() {
@Override
public void onAdLoaded(@NonNull InterstitialAd ad) {
mInterstitialAd = ad;
// Start auto-refresh countdown (~55 min)
scheduleAdRefresh();
}
@Override
public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
Log.e("AdMob", "Interstitial load failed: " + loadAdError.getMessage());
}
});
}
private void scheduleAdRefresh() {
if (refreshRunnable != null) {
refreshHandler.removeCallbacks(refreshRunnable);
}
refreshRunnable = () -> {
if (mInterstitialAd != null) {
// Optional: log or monitor usage before discard
mInterstitialAd = null; // Clear reference explicitly
}
loadInterstitialAd(); // Reload fresh ad
};
refreshHandler.postDelayed(refreshRunnable, 55 * 60 * 1000);
}⚠️ 注意事项:
- 不要依赖 mInterstitialAd != null 作为“可展示”的唯一判断依据——它只表示对象未被 GC,不代表广告仍有效;
- 避免在 Activity/Fragment 销毁后继续持有 InterstitialAd 引用,防止内存泄漏;
- 若用户长时间停留在某页面(如游戏关卡、阅读页),建议结合业务逻辑(如场景切换、停留时长阈值)触发提前刷新;
- 在测试阶段可通过日志 + onAdDismissedFullScreenContent() 回调验证广告是否真实计费(有效曝光通常伴随该回调)。
? 总结:AdMob 插页广告不是“一次加载、永久可用”的资源,而是具有明确时效性的服务对象。将广告生命周期纳入应用状态管理,是保障广告收益稳定性和用户体验流畅性的关键实践。










