如何实现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(); } }
逻辑说明
Splash_Activity不再依赖固定时长跳转,而是等待两个触发条件:计时结束且无广告展示,或广告被用户关闭/展示失败- 广告的所有关键状态变化都会通过回调通知启动页,确保只有用户处理完广告后才进入主页
- 彻底解决广告残留后台的问题,因为启动页仅在广告完全处理完毕后才会结束
内容的提问来源于stack exchange,提问作者Ğassen EL-MAHMUD
相关产品推荐
相关产品推荐

