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

相关推荐
灯澜忆梦12 小时前
GO_并发编程---定时器
开发语言·后端·golang
-银雾鸢尾-13 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-13 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白14 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
HLC++16 小时前
Linux的进程间通信
android·linux·服务器
段一凡-华北理工大学16 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
Ljwuhe16 小时前
C++——多态
开发语言·c++
心平气和量大福大17 小时前
C#-WPF-Window主窗体
开发语言·c#·wpf
从零开始的代码生活_18 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法
云小逸18 小时前
【C++ 第七阶段:模板、泛型编程与工程综合详解】
开发语言·c++