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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:24:01