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

如何在关闭第二个Activity后展示广告?含Fragment返回流程实现

实现Fragment→第二个Activity→广告→第一个Activity的返回流程

这个需求核心是精准控制返回事件的处理顺序:先处理Fragment的回退栈,待Fragment栈清空后,再触发广告展示,等广告关闭后才关闭第二个Activity回到第一个页面。下面分步骤给你具体实现方案:

1. 拦截Fragment的返回事件

由于Fragment本身没有onBackPressed方法,我们可以利用AndroidX的OnBackPressedCallback来拦截Fragment内的返回操作,优先处理Fragment的回退栈:

Kotlin 示例

在你的Fragment的onViewCreated方法中添加回调:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    
    // 拦截返回键事件
    requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
        // 判断当前Fragment是否有子Fragment回退栈
        if (childFragmentManager.backStackEntryCount > 0) {
            // 有回退栈则先弹出上一个Fragment
            childFragmentManager.popBackStack()
        } else {
            // 没有回退栈了,通知Activity准备展示广告并退出
            (requireActivity() as SecondActivity).showAdBeforeFinish()
        }
    }
}

Java 示例

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            if (getChildFragmentManager().getBackStackEntryCount() > 0) {
                getChildFragmentManager().popBackStack();
            } else {
                ((SecondActivity) requireActivity()).showAdBeforeFinish();
            }
        }
    });
}

2. 在第二个Activity中实现广告展示与退出逻辑

在SecondActivity里定义一个方法,负责调用你的show_ads()函数,并监听广告的关闭事件,确保广告关闭后再退出Activity:

Kotlin 示例

// 定义展示广告并退出的方法
fun showAdBeforeFinish() {
    // 调用你的插页广告展示函数,这里假设show_ads支持传入广告监听回调
    show_ads(object : AdListener {
        override fun onAdClosed() {
            // 广告关闭后,正式退出当前Activity,回到第一个Activity
            finish()
        }

        override fun onAdFailedToLoad(error: LoadAdError) {
            // 广告加载失败时,直接退出,避免用户卡住
            finish()
        }

        // 可选:处理其他广告回调,比如广告加载成功、被点击等
        override fun onAdLoaded() {
            // 广告加载完成后的逻辑(如果需要)
        }
    })
}

// 处理Activity本身的返回键(当页面没有Fragment覆盖时)
override fun onBackPressed() {
    // 先尝试弹出Activity的Fragment回退栈,如果没有则执行广告逻辑
    if (!supportFragmentManager.popBackStackImmediate()) {
        showAdBeforeFinish()
    }
}

Java 示例

public void showAdBeforeFinish() {
    show_ads(new AdListener() {
        @Override
        public void onAdClosed() {
            finish();
        }

        @Override
        public void onAdFailedToLoad(LoadAdError loadAdError) {
            finish();
        }

        @Override
        public void onAdLoaded() {
            // 可选:广告加载成功后的处理
        }
    });
}

@Override
public void onBackPressed() {
    if (!getSupportFragmentManager().popBackStackImmediate()) {
        showAdBeforeFinish();
    }
}

关键注意事项

  • 广告回调的必要性:必须确保show_ads()函数支持监听广告关闭事件,否则广告会在Activity退出时被销毁,用户无法正常查看广告。
  • 异常情况处理:一定要处理广告加载失败的场景,避免用户因广告加载问题无法返回上一页。
  • 回退栈判断:无论是Fragment内部还是Activity层面,都要先判断回退栈是否为空,保证Fragment的正常页面跳转逻辑不受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:29:54