
admob插页广告加载后仅在1小时内有效,超时未展示将导致广告失效、印象不被计费;开发者需在一小时后主动清除旧广告并重新请求。
在使用 com.google.android.gms.ads.interstitial.InterstitialAd 实现插页广告时,许多开发者误以为只要 mInterstitialAd != null 就可随时调用 .show() 展示广告。然而,AdMob 明确规定:预加载的插页广告具有严格的时效性——自成功加载起,有效期仅为 60 分钟。
超过一小时后,即使对象非空,调用 show() 仍可能触发无响应、黑屏、静默失败,或更关键的是:该次展示不会被 AdMob 后台记录为有效广告印象(impression),直接影响填充率、eCPM 和广告收入。
✅ 正确做法:实现带时效管理的广告缓存
推荐采用「懒加载 + 定时刷新」策略,避免手动维护时间戳带来的逻辑漏洞:
public class AdManager {
private InterstitialAd mInterstitialAd;
private long mLoadTimeMs = 0;
public void loadInterstitialAd(Context context) {
InterstitialAd.load(context, "YOUR_AD_UNIT_ID", new AdRequest.Builder().build(),
new InterstitialAdLoadCallback() {
@Override
public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
mInterstitialAd = interstitialAd;
mLoadTimeMs = System.currentTimeMillis();
Log.d("AdManager", "Interstitial loaded successfully.");
}
@Override
public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
mInterstitialAd = null;
Log.e("AdManager", "Interstitial load failed: " + loadAdError.getMessage());
}
});
}
public boolean isAdReadyAndFresh() {
if (mInterstitialAd == null) return false;
long ageMs = System.currentTimeMillis() - mLoadTimeMs;
return ageMs < 60 * 60 * 1000; // < 1 hour
}
public void showInterstitialIfReady(Activity activity) {
if (isAdReadyAndFresh()) {
mInterstitialAd.show(activity);
} else {
// 过期:清除引用并触发重载(可选自动重载,或延迟至下次合适时机)
mInterstitialAd = null;
Log.w("AdManager", "Interstitial expired. Requesting new ad...");
loadInterstitialAd(activity.getApplicationContext());
}
}
}⚠️ 注意事项与最佳实践
- 不可依赖 null 判断作为有效性唯一依据:mInterstitialAd != null 仅表示对象存在,不保证其处于可展示状态;
- 禁止跨 Activity 或长时间后台保活广告实例:App 进入后台超时、内存回收、进程重启均可能导致广告失效,应结合生命周期(如 onResume())检查并按需重载;
- 建议搭配预加载时机优化:在用户完成关键操作(如关卡通关、表单提交成功)前 30–60 秒预加载,提升展示成功率;
- 注意 GDPR/CCPA 合规性:每次新广告请求均需确保用户已授权同意广告追踪,避免因权限缺失导致加载失败却误判为超时;
- 监控日志与异常上报:对 onAdFailedToLoad 及超时丢弃行为添加埋点,便于分析广告生命周期健康度。
综上,将插页广告视为「有时效的资源」而非「静态对象」,是保障变现稳定性的基础。严格遵循 1 小时限期规则,并通过封装化管理降低出错概率,才能在用户体验与商业收益之间取得可持续平衡。










