AdMob点击触发插屏广告加载时机与调用次数咨询
AdMob插屏广告加载位置与调用次数说明
为什么不建议放在onStart/onResume中
- 这两个生命周期会在页面首次启动、切后台回前台、从其他Activity返回当前页面时重复触发,若在此处调用加载逻辑,会产生大量冗余广告请求,轻则消耗用户流量、浪费广告请求配额,重则触发AdMob的异常流量检测,降低账号填充率甚至触发风控。
正确的调用位置与加载规则
- 首次加载:在当前Activity的
onCreate方法中调用1次CallNewInertial()即可,页面初始化阶段提前预加载广告,等用户触发点击动作时广告基本已加载完成,不会出现点击后无广告可展示的等待问题。 - 补加载时机:
- 广告正常展示结束,在
onAdDismissedFullScreenContent回调中,将mInterstitialAd置空后调用1次CallNewInertial(),预加载下一次待展示的广告 - 广告展示失败,在
onAdFailedToShowFullScreenContent回调中,将mInterstitialAd置空后调用1次CallNewInertial()补加载
- 广告正常展示结束,在
- 重试规则:你当前在
onAdFailedToLoad中直接无限递归调用requestNewInterstitial()的写法存在问题,遇到网络波动、无广告填充的情况会持续发送高频请求,需要加指数退避逻辑,比如首次失败等3s重试,第二次等6s,最长间隔不超过30s,连续重试3-5次仍失败就暂停,等下次页面回到前台或用户触发点击动作时再尝试加载。 - 总加载原则:AdMob插屏广告实例仅可展示一次,展示完成后实例自动失效,不需要固定总加载次数,内存中始终保持最多1个预加载完成的待展示广告实例即可,不要同时加载多个广告实例浪费资源。
现有代码的修正点
- 补全
CallNewInertial()方法缺失的闭合大括号,否则无法通过编译 - 不要在调用
show()方法之后才给广告实例设置FullScreenContentCallback,需要在onAdLoaded回调拿到广告实例时就绑定回调,避免漏抓广告展示早期的事件 - 点击按钮时如果判断
mInterstitialAd == null,要加兜底的业务跳转逻辑,不要让用户点击无响应,同时可以触发一次广告加载
修正后的核心代码参考:
private long retryDelay = 3000; private int retryCount = 0; private final int MAX_RETRY = 5; private void CallNewInertial() { ConnectionDetector cd = new ConnectionDetector(MainActivity.this); if (cd.isConnectingToInternet()) { requestNewInterstitial(); } } private void requestNewInterstitial() { AdRequest adRequest = new AdRequest.Builder().build(); InterstitialAd.load(MainActivity.this, getString(R.string.adMob_interstitial), adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; // 加载成功重置重试参数 retryCount = 0; retryDelay = 3000; // 加载完成时直接绑定全屏回调 mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { mInterstitialAd = null; // 广告关闭后执行业务跳转 startActivity(i); // 预加载下一个广告 CallNewInertial(); } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { mInterstitialAd = null; // 展示失败直接走业务跳转,不卡用户流程 startActivity(i); // 补加载广告 CallNewInertial(); } }); } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { mInterstitialAd = null; // 指数退避重试,避免高频请求 if (retryCount < MAX_RETRY) { new Handler(Looper.getMainLooper()).postDelayed(() -> { retryCount++; retryDelay *= 2; requestNewInterstitial(); }, retryDelay); } } }); } private void OnClick(){ if (mInterstitialAd != null ) { mInterstitialAd.show(MainActivity.this); } else { // 没加载出广告时直接走业务逻辑,不阻塞用户操作 startActivity(i); // 触发一次广告加载 CallNewInertial(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 首次初始化时调用一次预加载 CallNewInertial(); // 其余点击事件等初始化逻辑 }
注意:不要为了提高广告展示率在用户点击按钮后才临时加载广告,会导致用户等待时间过长,体验很差。
内容的提问来源于stack exchange,提问作者Elparaguas
相关产品推荐
相关产品推荐

