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

AdMob插屏广告(Interstitial)仅首次显示问题求解

问题根因

插屏广告为单次消费资源,广告展示完成、展示失败后实例会直接失效。当前代码仅在MainActivity的onCreate生命周期中执行了一次广告加载逻辑:从Activity2返回MainActivity时,Activity实例并未被销毁重建,onCreate不会二次触发,失效后被置为null的广告对象没有重新加载,自然无法再次展示。

修复方案
  • 将广告加载逻辑抽离为独立方法,方便多场景复用调用
  • 广告关闭、广告展示失败的回调中,实例置空后立刻发起下一次广告预加载
  • 页面从后台/其他页面返回前台时,检查广告实例状态,无可用广告时触发补加载
  • 补全原有代码中缺失的adrequest_interstitial变量声明
修正后核心代码
public class MainActivity extends Activity {

    private InterstitialAd mInterstitialAd;
    private AdRequest adrequest_interstitial;
    private static final String TAG = "InfoApp";
    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        // 初始化移动广告SDK
        MobileAds.initialize(this, initializationStatus -> {
            // SDK初始化完成后加载首批广告
            loadInterstitialAd();
        });
     }

    // 独立的插屏广告加载方法
    private void loadInterstitialAd() {
        // 已有加载完成的可用广告时跳过重复请求
        if (mInterstitialAd != null) return;

        adrequest_interstitial = new AdRequest.Builder().build();
        InterstitialAd.load(this, ConfigPubli.Ads_interstitial, adrequest_interstitial,
                new InterstitialAdLoadCallback() {
                    @Override
                    public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                        mInterstitialAd = interstitialAd;
                        Log.i(TAG, "onAdLoaded");
                    }

                    @Override
                    public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                        Log.i(TAG, loadAdError.getMessage());
                        mInterstitialAd = null;
                        // 加载失败建议加3-5秒延时后重试,避免高频请求触发平台流量限制
                    }
                });
    }

    public void adstot(Intent i){
        mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
            @Override
            public void onAdDismissedFullScreenContent() {
                mInterstitialAd = null;
                startActivity(i);
                // 广告关闭后立刻预加载下一次展示的广告
                loadInterstitialAd();
            }

            @Override
            public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                mInterstitialAd = null;
                startActivity(i);
                // 广告展示失败后重新加载
                loadInterstitialAd();
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 从其他页面返回时,无可用广告则触发加载
        if (mInterstitialAd == null) {
            loadInterstitialAd();
        }
    }

    public void page2(View view){
        Intent i = new Intent (this, Activity2.class);
        i.putExtra("valor","page2");

        int randomAd = (int)(Math.random()*10);
        // 注:原有判断逻辑randomAd<=1为20%展示概率(取值0、1均触发),若需10%概率请修改为randomAd == 0
        if (mInterstitialAd != null && randomAd<=1) {   
            adstot(i);
            mInterstitialAd.show(this);   
        } else{
            startActivity(i);
        }   
     }
}
注意事项
  • 广告加载失败回调中不要无限制立刻重试,高频请求容易被广告平台判定为异常流量,导致填充率下降甚至账号受限
  • 插屏广告必须提前预加载,不要等用户点击跳转按钮时才临时发起请求,广告加载存在网络耗时,临时请求大概率因未加载完成导致展示失败
  • 遵守AdMob平台政策,控制插屏广告展示频次,不要在用户高频操作路径上强制弹出广告,避免违规被限制投放

内容的提问来源于stack exchange,提问作者lina0i0-29

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:39:19