如何仅在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
相关产品推荐
相关产品推荐

