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

Admob插屏广告仅按钮点击显示,onCreate调用show无效及打开Activity显示实现求助

为什么AdMob插屏广告在onCreate调用show()无效,只有点击按钮才生效?

这个问题我碰到过好多次了,核心原因其实很简单——AdMob的插屏广告(InterstitialAd)必须在完全加载完成之后才能调用show()方法,而你在onCreate()里调用的时候,广告大概率还处于加载状态,根本没准备好,自然不会显示。

具体原因拆解

  • 广告加载是异步操作:当你调用loadAd()请求广告后,AdMob需要在后台线程完成广告资源的请求、素材下载等流程,这个过程不是瞬间完成的。onCreate()方法执行时,这个异步加载流程可能还在进行中,此时mInterstitialAd的状态是未就绪的,调用show()不会有任何反应。
  • 按钮点击时广告已就绪:你第一次点击按钮时,广告已经完成了加载,所以show()能正常触发;但用户返回Activity时,之前的广告可能已经被销毁、过期,或者你没有重新加载新的广告,所以再次进入也不会显示。

解决方案:确保广告就绪后再触发显示

1. 利用广告加载回调,监听就绪状态

初始化广告时,通过InterstitialAdLoadCallback监听加载结果,只有当广告成功加载完成后,再在合适的时机调用show()。同时通过FullScreenContentCallback处理广告关闭后的逻辑(比如重新加载下一个广告)。

示例代码:

private InterstitialAd mInterstitialAd;

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

    // 初始化AdMob并加载广告
    MobileAds.initialize(this);
    loadInterstitialAd();
}

private void loadInterstitialAd() {
    AdRequest adRequest = new AdRequest.Builder().build();
    InterstitialAd.load(this, "你的广告单元ID", adRequest,
        new InterstitialAdLoadCallback() {
            @Override
            public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                // 广告加载成功,保存引用
                mInterstitialAd = interstitialAd;
                
                // 设置全屏广告回调,处理关闭/失败逻辑
                mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback(){
                    @Override
                    public void onAdDismissedFullScreenContent() {
                        // 广告关闭后,重新加载下一个广告
                        mInterstitialAd = null;
                        loadInterstitialAd();
                    }

                    @Override
                    public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                        // 广告显示失败,清空引用并重试
                        mInterstitialAd = null;
                        loadInterstitialAd();
                    }
                });

                // 此时广告已就绪,可以调用show()(确保Activity未被销毁)
                if (!isFinishing()) {
                    mInterstitialAd.show(MainActivity.this);
                }
            }

            @Override
            public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                // 加载失败,记录错误并重试
                mInterstitialAd = null;
                Log.d("AdMobDebug", "广告加载失败: " + loadAdError.getMessage());
            }
        });
}

2. 在onResume中检查广告状态,适配返回场景

用户返回Activity时,在onResume()方法里检查广告是否就绪,如果已加载就显示,否则重新加载:

@Override
protected void onResume() {
    super.onResume();
    // 检查广告是否存在且未被使用
    if (mInterstitialAd != null) {
        mInterstitialAd.show(this);
    } else {
        loadInterstitialAd();
    }
}

3. 额外注意事项

  • 使用正确的广告单元ID:测试阶段可以用AdMob提供的测试ID(比如插屏测试ID:ca-app-pub-3940256099942544/1033173712),正式上线替换为自己的ID。
  • 避免频繁弹广告:AdMob有政策限制,短时间内重复弹出广告可能会被限流,影响收益和用户体验。
  • 防止内存泄漏:在Activity销毁时清空广告引用:
@Override
protected void onDestroy() {
    super.onDestroy();
    mInterstitialAd = null;
}

按照这个逻辑调整后,你就能实现打开Activity时自动显示插屏广告,且用户返回时也能正常触发的效果了。

内容的提问来源于stack exchange,提问作者a k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:39:57