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
相关产品推荐
相关产品推荐

