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

如何仅在App冷启动时展示App Open Ads(符合Admob政策)

解决方案:仅在冷启动时展示App Open Ads

要实现仅在冷启动(进程完全销毁后首次启动)展示开屏广告,核心是准确区分冷启动和热启动/后台返回场景,下面是具体的代码修改方案:

1. 在MyApplication中维护冷启动状态

修改MyApplication.java,添加状态标记并通过生命周期回调管理状态:

public class MyApplication extends Application {
    // 标记是否为冷启动,进程启动时默认true
    private boolean isColdLaunch = true;
    private int activityCount = 0;

    @Override
    public void onCreate() {
        super.onCreate();
        // 注册Activity生命周期监听,区分前后台切换
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {}

            @Override
            public void onActivityStarted(@NonNull Activity activity) {
                activityCount++;
                // 应用从后台回到前台时,无需修改冷启动标记(冷启动仅触发一次)
            }

            @Override
            public void onActivityResumed(@NonNull Activity activity) {}

            @Override
            public void onActivityPaused(@NonNull Activity activity) {}

            @Override
            public void onActivityStopped(@NonNull Activity activity) {
                activityCount--;
                // 应用完全进入后台,下次回到前台属于热启动
            }

            @Override
            public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}

            @Override
            public void onActivityDestroyed(@NonNull Activity activity) {}
        });
    }

    // 获取冷启动状态,且仅在首次调用后重置为false(确保只触发一次)
    public boolean isColdLaunch() {
        boolean result = isColdLaunch;
        // 一旦获取过冷启动状态,立即重置为false,避免后续误触发
        isColdLaunch = false;
        return result;
    }
}

2. 修改SplashActivity,仅冷启动时加载广告

修改SplashActivity.java,在启动时判断冷启动状态,仅符合条件时展示广告:

public class SplashActivity extends AppCompatActivity {
    private AppOpenAd appOpenAd;
    private boolean isAdShowing = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        MyApplication myApp = (MyApplication) getApplication();
        if (myApp.isColdLaunch()) {
            // 冷启动场景,加载开屏广告
            loadAppOpenAd();
        } else {
            // 非冷启动,直接跳转到主界面
            navigateToMainActivity();
        }
    }

    // 加载开屏广告的方法(保留你原有逻辑,仅调整触发时机)
    private void loadAppOpenAd() {
        AdRequest adRequest = new AdRequest.Builder().build();
        AppOpenAd.load(
                this,
                "你的广告ID",
                adRequest,
                AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT,
                new AppOpenAd.AppOpenAdLoadCallback() {
                    @Override
                    public void onAdLoaded(@NonNull AppOpenAd ad) {
                        appOpenAd = ad;
                        // 广告加载成功后展示
                        showAppOpenAd();
                    }

                    @Override
                    public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                        // 广告加载失败,直接跳主界面
                        navigateToMainActivity();
                    }
                }
        );
    }

    // 展示开屏广告的方法(保留原有逻辑)
    private void showAppOpenAd() {
        if (appOpenAd != null && !isAdShowing) {
            isAdShowing = true;
            appOpenAd.show(this);
            // 广告展示回调,结束后跳主界面
            appOpenAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                @Override
                public void onAdDismissedFullScreenContent() {
                    isAdShowing = false;
                    navigateToMainActivity();
                }

                @Override
                public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                    isAdShowing = false;
                    navigateToMainActivity();
                }
            });
        } else {
            navigateToMainActivity();
        }
    }

    // 跳转到主界面的方法
    private void navigateToMainActivity() {
        startActivity(new Intent(SplashActivity.this, MainActivity.class));
        finish();
    }
}

3. 关键逻辑说明

  • 冷启动判断:MyApplication中的isColdLaunch仅在进程启动时为true,首次调用isColdLaunch()后立即重置为false,确保即使应用后台再返回,也不会重复触发广告。
  • 生命周期监听:通过ActivityLifecycleCallbacks统计Activity数量,辅助区分应用前后台切换,避免误判场景。
  • 广告触发时机:仅在SplashActivity的onCreate中,判断冷启动状态为true时才加载广告,否则直接跳转主界面。

这样修改后,广告只会在点击桌面图标、进程完全销毁后首次启动的场景展示,从任务管理器返回、离开应用后点击图标返回的热启动场景将不再展示广告,符合Admob政策要求。

内容的提问来源于stack exchange,提问作者user3137451

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 03:05:13