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

Admob插页广告应用内展示与后台曝光量统计不符问题排查

Admob插页广告曝光量统计异常问题排查

我实现了InterstitialManager和InterstitialBackup类来展示插页广告,主广告加载失败时用备份广告展示。应用内广告展示正常,但Admob后台曝光量统计极低——比如应用内展示100次,后台仅统计到7-10次。以下是代码实现及问题排查与修复方案:


原代码实现

InterstitialManager类(InterstitialBackup类逻辑一致)

public class InterstitialManager {
  private static final String TAG = "InterstitialManager";
  public InterstitialAd interstitialAd;
  private boolean adLoaded;
  private String adUnitId;
  InterstitialManagerBackup interstitialManagerBackup ;

    public InterstitialManager(Context context, String adUnitId) {
        this.adUnitId = adUnitId;
        loadAd(context);
    }

 private void loadAd(Context context) {
     InterstitialAd.load(context, adUnitId, new AdRequest.Builder().build(),
     new InterstitialAdLoadCallback() {
      @Override
      public void onAdLoaded(InterstitialAd ad) {
       interstitialAd = ad;
            adLoaded = true;
                        interstitialManagerBackup = new InterstitialManagerBackup(context,"ca-app-pub-3940256099942544/1033173712");
                        Log.d(TAG, "Interstitial ad loaded"+interstitialAd.toString());
                    }

                    @Override
                    public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                        super.onAdFailedToLoad(loadAdError);
                        Log.d(TAG, "Interstitial ad failed"+loadAdError.getMessage());
                    }
                });
    }

    public void showAd(Activity activity) {
        if (adLoaded && interstitialAd != null) {
            interstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                @Override
                public void onAdImpression() {
                    Log.d(TAG, "Interstitial ad impression recorded");
                }

                @Override
                public void onAdDismissedFullScreenContent() {
                   
                    interstitialAd = null;
                      loadAd(activity.getApplicationContext());     
                    Log.d(TAG, "Interstitial ad dismissed");
                }
            });
            interstitialAd.show(activity);
        } else {
            Log.d(TAG, "Interstitial ad not loaded yet. Loading now...");
            loadAd(activity.getApplicationContext());
        }
    }
}

MyApplication类

public class MyApplication extends Application {
    private InterstitialManager interstitialManager;
    private InterstitialManagerBackup interstitialManagerBackup;

    @Override
    public void onCreate() {
        super.onCreate();
        interstitialManager = new InterstitialManager(this, "ca-app-pub-3940256099942544/1033173712");
        interstitialManagerBackup = new InterstitialManagerBackup(this,"ca-app-pub-3940256099942544/1033173712");

    }

    public InterstitialManager getInterstitialManager() {
        return interstitialManager;
    }

    public InterstitialManagerBackup getInterstitialManagerBackup() {
        return interstitialManagerBackup;
    }
}

MainActivity类

public class MainActivity extends AppCompatActivity {

    private InterstitialManager interstitialManager;
    Button showAdbutton,nextActButton;
    private InterstitialManagerBackup interstitialManagerBackup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showAdbutton = findViewById(R.id.btn_show_ad);
        nextActButton = findViewById(R.id.second_act);

        MyApplication application = (MyApplication) getApplication();
        interstitialManager = application.getInterstitialManager();
        interstitialManagerBackup = application.getInterstitialManagerBackup();


        showAdbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (interstitialManager.interstitialAd!= null){
                    showInterstitialAd();
                }else{
                    showInterstitailBackup();
                }

            }
        });


    }

    private void showInterstitialAd() {
        interstitialManager.showAd(this);
    }
    private  void showInterstitailBackup(){
        interstitialManagerBackup.showAd(MainActivity.this);
    }
}

问题根源分析

  1. 重复创建备份广告实例:InterstitialManager的onAdLoaded方法中重新实例化InterstitialManagerBackup,覆盖了MyApplication中初始化的备份实例,导致备份广告状态混乱,展示的广告可能未绑定统计回调。
  2. 直接访问public变量判断加载状态:MainActivity通过interstitialManager.interstitialAd != null判断广告可用性,忽略了adLoaded标志。Admob广告实例过期后可能仍不为null,但此时展示不会触发曝光统计。
  3. 回调设置时机滞后:在showAd方法中才设置FullScreenContentCallback,若广告加载后到展示前状态变化,可能无法捕获曝光事件。
  4. 备份广告逻辑冲突:MyApplication同时初始化主、备份广告,主广告加载成功后又创建新备份实例,导致备份广告加载状态不一致。

修复后的代码实现

修改后的InterstitialManager类

public class InterstitialManager {
    private static final String TAG = "InterstitialManager";
    private InterstitialAd interstitialAd;
    private boolean adLoaded;
    private final String adUnitId;
    private final InterstitialManagerBackup interstitialManagerBackup;

    // 构造方法传入已初始化的备份管理器,避免重复创建
    public InterstitialManager(Context context, String adUnitId, InterstitialManagerBackup backup) {
        this.adUnitId = adUnitId;
        this.interstitialManagerBackup = backup;
        loadAd(context);
    }

    private void loadAd(Context context) {
        InterstitialAd.load(context, adUnitId, new AdRequest.Builder().build(),
                new InterstitialAdLoadCallback() {
                    @Override
                    public void onAdLoaded(InterstitialAd ad) {
                        interstitialAd = ad;
                        adLoaded = true;
                        // 加载完成立即设置回调,确保事件被捕获
                        setupAdCallback(ad);
                        Log.d(TAG, "Interstitial ad loaded: " + interstitialAd.toString());
                    }

                    @Override
                    public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                        interstitialAd = null;
                        adLoaded = false;
                        Log.d(TAG, "Interstitial ad failed: " + loadAdError.getMessage());
                        // 主广告加载失败时触发备份广告加载
                        interstitialManagerBackup.loadAd(context);
                    }
                });
    }

    private void setupAdCallback(InterstitialAd ad) {
        ad.setFullScreenContentCallback(new FullScreenContentCallback() {
            @Override
            public void onAdImpression() {
                Log.d(TAG, "Interstitial ad impression recorded");
            }

            @Override
            public void onAdDismissedFullScreenContent() {
                interstitialAd = null;
                adLoaded = false;
                loadAd(ad.getApplicationContext());
                Log.d(TAG, "Interstitial ad dismissed");
            }

            @Override
            public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                interstitialAd = null;
                adLoaded = false;
                Log.d(TAG, "Ad failed to show: " + adError.getMessage());
                // 展示失败自动切换到备份广告
                interstitialManagerBackup.showAd((Activity) ad.getApplicationContext());
            }
        });
    }

    public void showAd(Activity activity) {
        if (adLoaded && interstitialAd != null) {
            interstitialAd.show(activity);
        } else {
            Log.d(TAG, "Interstitial ad not loaded. Showing backup ad...");
            interstitialManagerBackup.showAd(activity);
            loadAd(activity.getApplicationContext());
        }
    }

    // 封装状态判断方法,避免直接访问内部变量
    public boolean isAdLoaded() {
        return adLoaded && interstitialAd != null;
    }
}

修改后的InterstitialManagerBackup类

public class InterstitialManagerBackup {
    private static final String TAG = "InterstitialBackup";
    private InterstitialAd interstitialAd;
    private boolean adLoaded;
    private final String adUnitId;

    public InterstitialManagerBackup(Context context, String adUnitId) {
        this.adUnitId = adUnitId;
        loadAd(context);
    }

    public void loadAd(Context context) {
        InterstitialAd.load(context, adUnitId, new AdRequest.Builder().build(),
                new InterstitialAdLoadCallback() {
                    @Override
                    public void onAdLoaded(InterstitialAd ad) {
                        interstitialAd = ad;
                        adLoaded = true;
                        setupAdCallback(ad);
                        Log.d(TAG, "Backup interstitial ad loaded: " + interstitialAd.toString());
                    }

                    @Override
                    public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                        interstitialAd = null;
                        adLoaded = false;
                        Log.d(TAG, "Backup interstitial ad failed: " + loadAdError.getMessage());
                    }
                });
    }

    private void setupAdCallback(InterstitialAd ad) {
        ad.setFullScreenContentCallback(new FullScreenContentCallback() {
            @Override
            public void onAdImpression() {
                Log.d(TAG, "Backup ad impression recorded");
            }

            @Override
            public void onAdDismissedFullScreenContent() {
                interstitialAd = null;
                adLoaded = false;
                loadAd(ad.getApplicationContext());
                Log.d(TAG, "Backup ad dismissed");
            }
        });
    }

    public void showAd(Activity activity) {
        if (adLoaded && interstitialAd != null) {
            interstitialAd.show(activity);
        } else {
            Log.d(TAG, "Backup ad not loaded. Loading now...");
            loadAd(activity.getApplicationContext());
        }
    }

    public boolean isAdLoaded() {
        return adLoaded && interstitialAd != null;
    }
}

修改后的MyApplication类

public class MyApplication extends Application {
    private InterstitialManager interstitialManager;
    private InterstitialManagerBackup interstitialManagerBackup;

    @Override
    public void onCreate() {
        super.onCreate();
        // 先初始化备份管理器
        interstitialManagerBackup = new InterstitialManagerBackup(this, "ca-app-pub-3940256099942544/1033173712");
        // 将备份管理器传入主管理器,保证实例唯一
        interstitialManager = new InterstitialManager(this, "ca-app-pub-3940256099942544/1033173712", interstitialManagerBackup);
    }

    public InterstitialManager getInterstitialManager() {
        return interstitialManager;
    }

    public InterstitialManagerBackup getInterstitialManagerBackup() {
        return interstitialManagerBackup;
    }
}

修改后的MainActivity类

public class MainActivity extends AppCompatActivity {
    private InterstitialManager interstitialManager;
    Button showAdbutton;
    private InterstitialManagerBackup interstitialManagerBackup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        showAdbutton = findViewById(R.id.btn_show_ad);

        MyApplication application = (MyApplication) getApplication();
        interstitialManager = application.getInterstitialManager();
        interstitialManagerBackup = application.getInterstitialManagerBackup();

        showAdbutton.setOnClickListener(v -> {
            if (interstitialManager.isAdLoaded()) {
                interstitialManager.showAd(this);
            } else if (interstitialManagerBackup.isAdLoaded()) {
                interstitialManagerBackup.showAd(this);
            } else {
                Log.d("MainActivity", "No ad available, loading...");
                interstitialManager.loadAd(this);
            }
        });
    }
}

修复核心要点

  1. 移除重复创建备份实例的逻辑,通过构造方法传递已初始化的备份管理器,保证广告状态一致性。
  2. 使用封装的isAdLoaded()方法判断广告可用性,避免直接访问public变量,确保判断准确。
  3. 广告加载完成后立即设置回调,确保曝光、展示失败等事件被Admob正确捕获。
  4. 主广告展示失败时自动切换到备份广告,避免遗漏展示机会,同时统一广告生命周期管理,展示后及时重置状态并重新加载。

内容的提问来源于stack exchange,提问作者Tanvi Verma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:44:58