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

如何用OnBackPressedDispatcher替代Activity中最简单的onBackPressed逻辑?

适配Android SDK 33:替换弃用的onBackPressed()为onBackPressedDispatcher的解决方案

要实现原代码中「先执行自定义逻辑,再让系统处理返回操作」的需求,可以通过onBackPressedDispatcher添加一个始终启用的回调来完成,具体实现如下:

替换后的代码示例

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // 其他初始化代码...

    onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // 先执行你的自定义逻辑
            setResult(Activity.RESULT_CANCELED)
            
            // 禁用当前回调,避免触发系统返回时循环调用自身
            isEnabled = false
            // 触发系统默认的返回流程,等价于原代码中的super.onBackPressed()
            onBackPressedDispatcher.onBackPressed()
            // 重新启用回调,保证下次返回仍会执行自定义逻辑
            isEnabled = true
        }
    })
}

关键逻辑说明

  • 初始化OnBackPressedCallback(true)时传入true,表示这个回调始终处于启用状态,无需手动切换。
  • 调用isEnabled = false是必要的:如果直接调用onBackPressedDispatcher.onBackPressed(),当前回调会再次被触发,导致无限循环。禁用后,系统会执行默认的返回逻辑(比如弹出Fragment返回栈、finish当前Activity等)。
  • 执行完系统返回逻辑后,重新设置isEnabled = true,确保用户下次按下返回键时,依然会先执行你的自定义代码。

如果你的场景中没有Fragment返回栈等复杂返回逻辑,也可以直接在自定义逻辑后调用finish()来替代系统默认返回,但上面的方案更通用,完全匹配原代码的行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:27:37