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

如何实现Admob开屏广告与Splash_Activity联动:广告关闭后再跳转

解决Admob开屏广告与启动页计时冲突问题

背景

我集成Admob开屏广告时,因为广告比应用内容先展示,导致应用多次被拒。后来添加了Splash_Activity先展示一段时间再显示广告,应用顺利通过审核。

当前问题

Splash_Activity的计时结束后,广告会随启动页一同消失,无需用户操作就直接进入主页,此时广告会残留到应用后台。

需求

让Splash_Activity在广告展示时暂停计时,直到用户关闭广告后,再结束启动页并跳转至主页。


修改方案(分两步)

第一步:改造Splash_Activity的跳转逻辑

把固定延迟的跳转逻辑改成响应广告状态的动态判断,添加标记跟踪广告是否关闭:

// 在Splash_Activity中定义全局变量
private Handler splashHandler;
private boolean adClosed = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    
    splashHandler = new Handler();
    // 启动初始计时,增加广告状态检查
    splashHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            // 满足任一条件就跳转:广告已关闭 / 无广告展示
            if (adClosed || !AppOpenManager.isShowingAd) {
                jumpToHome();
            } else {
                // 广告仍在展示,每隔500ms重新检查
                splashHandler.postDelayed(this, 500);
            }
        }
    }, 4200);
    
    // 初始化AppOpenManager,传入回调监听广告关闭事件
    new AppOpenManager(this, new AppOpenManager.AdStatusCallback() {
        @Override
        public void onAdDismissed() {
            adClosed = true;
            // 广告关闭后取消原有检查,直接跳转(加300ms缓冲让用户有反应时间)
            splashHandler.removeCallbacksAndMessages(null);
            splashHandler.postDelayed(() -> jumpToHome(), 300);
        }
    });
}

// 抽离跳转逻辑,代码更简洁
private void jumpToHome() {
    startActivity(new Intent(Splash_Activity.this, home_main.class));
    finish();
}

第二步:修改AppOpenManager,添加广告状态回调

让AppOpenManager在广告关闭、展示失败或无广告可展示时,通知Splash_Activity触发跳转:

public class AppOpenManager implements LifecycleObserver, Application.ActivityLifecycleCallbacks {

    private static final String LOG_TAG = "AppOpenManager";
    private static final String AD_UNIT_ID = "ca-app-pub-****/****";
    private AppOpenAd appOpenAd = null;
    private long loadTime = 0;

    private AppOpenAd.AppOpenAdLoadCallback loadCallback;
    private Activity currentActivity;
    public static boolean isShowingAd = false; // 改为public,方便启动页判断状态

    private final Application application;
    private final AdStatusCallback adStatusCallback;

    // 修改构造方法,接收广告状态回调
    public AppOpenManager(Application app, AdStatusCallback callback) {
        this.application = app;
        this.adStatusCallback = callback;
        this.application.registerActivityLifecycleCallbacks(this);
        ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        new Handler().postDelayed(() -> showAdIfAvailable(), 1500);
        Log.d(LOG_TAG, "onStart");
    }

    public void showAdIfAvailable() {
        if (!isShowingAd && isAdAvailable()) {
            Log.d(LOG_TAG, "Will show ad.");

            FullScreenContentCallback fullScreenContentCallback = new FullScreenContentCallback() {
                @Override
                public void onAdDismissedFullScreenContent() {
                    AppOpenManager.this.appOpenAd = null;
                    isShowingAd = false;
                    fetchAd();
                    // 通知启动页广告已关闭
                    if (adStatusCallback != null) {
                        adStatusCallback.onAdDismissed();
                    }
                }

                @Override
                public void onAdFailedToShowFullScreenContent(AdError adError) {
                    isShowingAd = false;
                    // 广告展示失败,通知启动页跳转
                    if (adStatusCallback != null) {
                        adStatusCallback.onAdDismissed();
                    }
                }

                @Override
                public void onAdShowedFullScreenContent() {
                    isShowingAd = true;
                }
            };

            appOpenAd.setFullScreenContentCallback(fullScreenContentCallback);
            appOpenAd.show(currentActivity);

        } else {
            Log.d(LOG_TAG, "Can not show ad.");
            fetchAd();
            // 无广告可展示,直接通知启动页跳转
            if (adStatusCallback != null) {
                adStatusCallback.onAdDismissed();
            }
        }
    }

    // 以下原有方法(fetchAd、getAdRequest、isAdAvailable等)保持不变

    // 定义回调接口,供启动页接收广告状态
    public interface AdStatusCallback {
        void onAdDismissed();
    }
}

逻辑说明

  1. Splash_Activity不再依赖固定时长跳转,而是等待两个触发条件:计时结束且无广告展示,或广告被用户关闭/展示失败
  2. 广告的所有关键状态变化都会通过回调通知启动页,确保只有用户处理完广告后才进入主页
  3. 彻底解决广告残留后台的问题,因为启动页仅在广告完全处理完毕后才会结束

内容的提问来源于stack exchange,提问作者Ğassen EL-MAHMUD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:55:36