
admob 插页广告加载后仅在 1 小时内有效,超时未展示将导致无效曝光;开发者需主动管理生命周期,定时重载以确保广告可展示且计费有效。
在 Android 应用中集成 Google AdMob 插页广告(InterstitialAd)时,一个常见但易被忽视的关键问题是:广告对象加载成功后,能“持有多久”再展示? 答案很明确:最长 60 分钟。
根据 AdMob 官方文档 关于展示率优化的说明,所有预加载(preloaded)的插页广告具有严格的时效性约束:
✅ 广告加载成功后,其有效生命周期为 1 小时(3600 秒); ❌ 超过 1 小时后调用 show(),即使 mInterstitialAd != null,该次展示不会被计入有效曝光(impression),也不会产生收益; ⚠️ 更严重的是,部分过期广告甚至可能触发空白展示、崩溃或 SDK 内部静默丢弃,影响用户体验与填充率。
正确的生命周期管理策略
你不应依赖 mInterstitialAd != null 作为“广告可用”的唯一判断条件。而应结合时间戳进行双重校验:
private InterstitialAd mInterstitialAd;
private long mAdLoadTimeMs;
// 加载广告时记录时间
private void loadInterstitialAd() {
InterstitialAd.load(this, "YOUR_AD_UNIT_ID", new AdRequest.Builder().build(),
new InterstitialAdLoadCallback() {
@Override
public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
mInterstitialAd = interstitialAd;
mAdLoadTimeMs = System.currentTimeMillis(); // 关键:记录加载时刻
Log.d("AdMob", "Interstitial ad loaded.");
}
@Override
public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
mInterstitialAd = null;
Log.e("AdMob", "Interstitial ad failed to load: " + loadAdError.getMessage());
}
});
}
// 展示前校验时效性
private void showInterstitialIfReady() {
if (mInterstitialAd == null) {
Log.d("AdMob", "Interstitial ad is null.");
return;
}
long elapsed = System.currentTimeMillis() - mAdLoadTimeMs;
if (elapsed > 60 * 60 * 1000L) { // 超过 1 小时
Log.w("AdMob", "Interstitial ad expired (" + elapsed / 60000 + " min). Reloading...");
mInterstitialAd = null;
loadInterstitialAd(); // 主动刷新
return;
}
// 安全展示
mInterstitialAd.show(this);
}注意事项与最佳实践
- 禁止长期持有广告实例:不要在 Application 或静态变量中长期缓存 InterstitialAd,避免内存泄漏与过期风险;
- 按场景触发重载:建议在关键用户路径节点(如关卡结束、视频播放完成、表单提交后)前 10–30 秒预加载,并在展示前做时效检查;
- 监听 onAdDismissedFullScreenContent() 后立即重载:用户关闭广告后是重载下一条的理想时机,既提升填充率,又规避过期;
- 监控日志与指标:通过 Logcat 过滤 "Interstitial ad expired",结合 AdMob 后台的「展示率(Impression Rate)」和「填充率(Fill Rate)」交叉分析,识别是否因缓存过期导致指标异常。
总之,AdMob 插页广告不是“一次加载、永久可用”的资源,而是具备明确 TTL(Time-To-Live)的短期凭证。尊重其生命周期约束,是保障商业化效果与用户体验平衡的技术基石。










