You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AdMob点击触发插屏广告加载时机与调用次数咨询

AdMob插屏广告加载位置与调用次数说明

为什么不建议放在onStart/onResume中

  • 这两个生命周期会在页面首次启动、切后台回前台、从其他Activity返回当前页面时重复触发,若在此处调用加载逻辑,会产生大量冗余广告请求,轻则消耗用户流量、浪费广告请求配额,重则触发AdMob的异常流量检测,降低账号填充率甚至触发风控。

正确的调用位置与加载规则

  • 首次加载:在当前Activity的onCreate方法中调用1次CallNewInertial()即可,页面初始化阶段提前预加载广告,等用户触发点击动作时广告基本已加载完成,不会出现点击后无广告可展示的等待问题。
  • 补加载时机:
    1. 广告正常展示结束,在onAdDismissedFullScreenContent回调中,将mInterstitialAd置空后调用1次CallNewInertial(),预加载下一次待展示的广告
    2. 广告展示失败,在onAdFailedToShowFullScreenContent回调中,将mInterstitialAd置空后调用1次CallNewInertial()补加载
  • 重试规则:你当前在onAdFailedToLoad中直接无限递归调用requestNewInterstitial()的写法存在问题,遇到网络波动、无广告填充的情况会持续发送高频请求,需要加指数退避逻辑,比如首次失败等3s重试,第二次等6s,最长间隔不超过30s,连续重试3-5次仍失败就暂停,等下次页面回到前台或用户触发点击动作时再尝试加载。
  • 总加载原则:AdMob插屏广告实例仅可展示一次,展示完成后实例自动失效,不需要固定总加载次数,内存中始终保持最多1个预加载完成的待展示广告实例即可,不要同时加载多个广告实例浪费资源。

现有代码的修正点

  1. 补全CallNewInertial()方法缺失的闭合大括号,否则无法通过编译
  2. 不要在调用show()方法之后才给广告实例设置FullScreenContentCallback,需要在onAdLoaded回调拿到广告实例时就绑定回调,避免漏抓广告展示早期的事件
  3. 点击按钮时如果判断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:33:28