OnBackPressedDispatcher
在androidx.activity 1.0.0
加入,旨在处理返回逻辑。您不仅可以获得在Activity
之外处理返回键的便捷方式。 根据您的需要,您可以在任意位置定义OnBackPressedCallback
,使其可复用,或根据应用程序的架构进行任何操作。 您不再需要重写Activity
中的onBackPressed()
方法,也不必提供自己的抽象来实现需求的代码。
ComponentActivity 是 FragmentActivity 和 AppCompatActivity 的基类,您可以通过使用其 OnBackPressedDispatcher(可以通过调用 getOnBackPressedDispatcher() )来控制返回按钮的行为。早在 Android 13 之前,官方已推荐使用 AndroidX 的 OnBackPressedDispatcher 来取代 onBackPressed()
// 该方法官方已弃用
@Deprecated("Deprecated in Java")
override fun onBackPressed() {
Log.d("xuan", "------onBackPressed")
super.onBackPressed()
}
建议使用 AndroidX.ComponentActivity 的 onBackPressedDispatcher 进行监听,它会在 activity 生命周期 onStart() 后才可监听到,onDestroy() 时自动销毁。它在 onBackPressed() 方法后面执行。
在Activity中使用
this.onBackPressedDispatcher.addCallback(this,object :
OnBackPressedCallback(true) {
override fun handleOnBackPressed(){
// 返回需要处理的事项
}
})
在Fragment中使用
getActivity().onBackPressedDispatcher.addCallback(getActivity(),object :
OnBackPressedCallback(true) {
override fun handleOnBackPressed(){
// 返回需要处理的事项
}
})
为了兼容 13 之前的设备建议保留现有的 Back 逻辑。
OnBackPressedDispatcher
控制如何将返回按钮事件分配给一个或多个OnBackPressedCallback
对象。OnBackPressedCallback
的构造函数将布尔值用于初始启用状态。 仅当启用了回调(即isEnabled()
返回true)时,调度程序才会调用回调的handleOnBackPressed()
来处理返回按钮事件。 您可以通过调用setEnabled()
来更改启用状态。
回调是通过
addCallback()
方法添加的。 强烈建议使用采用 LifecycleOwner 的addCallback()
方法。 这样可以确保仅在 LifecycleOwner 为 Lifecycle.State.STARTED 时才添加OnBackPressedCallback
。 当关联的 LifecycleOwner 被销毁时,该 activity 会删除已注册的回调,以防止内存泄漏,并使其适用于寿命比该activity
短的fragment
或其他生命周期所有者。