Android回退按钮处理方法总结

引言

1. Activity 级别的回退处理

方法一:重写 onBackPressed()

Kotlin 复制代码
@Override
public void onBackPressed() {
    if (shouldCustomHandleBack) {
        // 自定义回退逻辑
        handleCustomBackAction();
    } else {
        // 默认行为
        super.onBackPressed();
    }
}

方法二:使用 onBackPressedDispatcher(推荐)

Kotlin 复制代码
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (shouldInterceptBackPress) {
                    // 拦截回退事件
                    showExitConfirmation()
                } else {
                    // 允许默认行为
                    isEnabled = false
                    onBackPressed()
                }
            }
        })
    }
}

用的时候发现,官方已经onBackPressed 废弃了

现在推荐这样处理"返回":在 Activity 里 用 OnBackPressedDispatcher + OnBackPressedCallback

正文

在 Activity 里

OnBackPressedDispatcher + OnBackPressedCallback

Kotlin 复制代码
class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    onBackPressedDispatcher.addCallback(this,
      object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
          // TODO: 自定义返回逻辑
          // e.g. 先关闭抽屉/弹窗,否则再退出
          finish()
        }
      }
    )
  }
}

如果你只是想"触发默认返回",调用:

onBackPressedDispatcher.onBackPressed()

在 Fragment 里

viewLifecycleOwner 绑定生命周期(避免内存泄露):

Kotlin 复制代码
class DemoFragment : Fragment(R.layout.fragment_demo) {
  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    requireActivity().onBackPressedDispatcher.addCallback(
      viewLifecycleOwner,
      object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
          // TODO: Fragment 内自定义返回
          // 例如先消费一次返回,不想消费时可以:
          // isEnabled = false
          // requireActivity().onBackPressedDispatcher.onBackPressed()
        }
      }
    )
  }
}

如果用了 NavController,一般无需手动拦截:

// Toolbar 左上角返回键

toolbar.setNavigationOnClickListener { navController.navigateUp() }

想自定义时,再用上面的 OnBackPressedCallback 协调。

Jetpack Compose

androidx.activity.compose.BackHandler

Kotlin 复制代码
BackHandler(enabled = true) {
  // 自定义返回
}

小结

  • 不要再重写 onBackPressed()

  • 首选 OnBackPressedDispatcher + OnBackPressedCallback(Activity/Fragment/Compose 都有对应做法)。

  • 用 Navigation 时,默认就支持返回;需要拦截再加 Callback。

  • Android 13+ 若要玩预测性返回的高级用法,再考虑 OnBackInvokedCallback

相关推荐
AFinalStone6 分钟前
Android7 SystemUI 源码解析(六)QuickSettings快捷设置面板
android·systemui
Lazionr6 分钟前
二叉搜索树:从树形结构到高效查找
开发语言·c++
此生决int8 分钟前
深入理解C++系列(21)——异常
开发语言·c++
Kapaseker11 分钟前
你有搞明白 Volatile 什么意思吗?
android·kotlin
乌暮21 分钟前
Java 抽象类与接口详解:半成品图纸 vs 能力合同
java·开发语言·后端·学习
美狐美颜SDK开放平台23 分钟前
直播APP源码与视频美颜sdk如何配合?一套完整开发思路
android·人工智能·计算机视觉·音视频·直播美颜sdk
乐观的Terry28 分钟前
ShipDesk 完整使用教程:从新建项目到 SSH 自动发布
开发语言
心平气和量大福大32 分钟前
android-权限
android·java
2501_916008891 小时前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day46|贯穿项目 2 思维导图复盘
java·开发语言·vue.js·学习·spring