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

