Admob插屏广告展示后关应用仍触发onAdDismissedFullScreenContent怎么办
成因
- AdMob 插屏广告的
FullScreenContentCallback不会区分广告的关闭原因:不管是用户手动点击关闭按钮,还是应用被从后台划走导致广告依附的页面被系统销毁,都会触发onAdDismissedFullScreenContent回调。 - 从后台划走应用时,系统销毁应用进程是异步操作,回调执行时进程还未完全终止,此时你未做任何状态判断直接执行
startActivity逻辑,就会重新拉起应用进程并启动 MainActivity。 - 现有代码的时序存在隐患:你先调用了
mInterstitial.show()再设置FullScreenContentCallback,极端情况下广告快速展示触发回调时,回调还未完成注册,会导致逻辑异常。
解决方案
- 第一步:增加页面存活状态判断,在
onAdDismissedFullScreenContent最开始先判断当前 SplashActivity 是否已被销毁,是则直接终止后续逻辑:
@Override public void onAdDismissedFullScreenContent() { mInterstitial = null; // 新增状态判断 if (isFinishing() || isDestroyed()) { Log.e("ADDA12", "Activity已销毁,跳过跳转"); return; } Log.e("ADDA12", "The ad was dismissed."); finish(); Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class); startActivity(intent); }
- 第二步:优化回调注册时序,把
setFullScreenContentCallback的调用移到show()方法之前,避免回调丢失:
@Override public void onAdLoaded(@NonNull com.google.android.gms.ads.interstitial.InterstitialAd interstitialAd1) { mInterstitial = interstitialAd1; // 先设置回调再调用show interstitialAd1.setFullScreenContentCallback( new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { // 原有逻辑 } // 其余回调方法保持不变 }); mInterstitial.show(SplashActivity.this); Log.e("ADDA12", "onAdLoaded"); }
- 可选增强方案:全局监听应用前后台状态,通过 Application 注册
ActivityLifecycleCallbacks统计活跃Activity数量,若数量为0说明应用已退入后台,此时即便触发回调也不执行跳转逻辑,避免后台唤起应用的合规风险。
内容的提问来源于stack exchange,提问作者Milan.Tejani
相关产品推荐
相关产品推荐

