如果你将任何应用程序升级到 targetSdk 33,可能会注意到在 Activities 中的 OnBackPressed() 方法已经被弃用了。
“OnBackPressed()” 的弃用原因
在开始之前,让我们谈谈为什么会有这样的变化。你可能知道,从 Android 10 开始,系统提供了手势导航功能。更详细地说,系统支持像在 iOS 设备上从左向右滑动以返回(类似于 iOS 设备)的手势。但是当手势与应用程序中的水平滑动结合时,就会出现意外的行为。用户报告说,他们有时在应用程序中水平滑动时会触发系统返回。
问题在于,Android 系统无法区分手势是用于系统返回还是应用程序的返回导航。换句话说,它无法判断应用程序是否处理了该手势。
那么,我应该使用什么替代方法呢?
现在要介绍的是 onBackPressedDispatcher
。它被定义为一个调度程序,可以通过组合来注册 OnBackPressedCallback
实例,以处理 ComponentActivity.onBackPressed()
的回调。
要触发 onBackPressed
功能,只需使用 onBackPressedDispatcher.onBackPressed()
即可。如果你正在使用 ComponentActivity
,则应该触发旧的 onBackPressed
方法,除非你提供了一个 OnBackPressedCallback
。
说到 OnBackPressedCallback
,它是我们检测返回手势/导航的新方式。当用户点击返回按钮或执行返回手势(如果已启用)时,OnBackPressedDispatcher
会在需要时调用回调并启用回调。
如上所示,回调有一个布尔值参数,用于确定回调是否默认启用。在代码中,你可以在启用/禁用状态之间切换回调。当回调被启用时,handleOnBackPressed
方法会在用户进行返回导航事件时被调用。如果回调被禁用,则不会触发回调,显然,Android 系统将处理该事件。
从 Android 13 开始,系统将提供预测式返回手势,它会向用户展示他们即将通过滑动返回操作返回到启动器,以便用户可以决定是否真正想返回到启动器。为了迎接这个即将到来的功能,应用程序应该告诉系统它是否处理了滑动返回手势。
如何实现它
为了处理滑动返回手势并通知系统,你需要按照以下步骤进行操作:
-
1. 将
implementation "androidx.activity:activity:1.6.0-alpha05"
添加为你模块的build.gradle
文件的依赖项。 -
2. 使用
compileSdk 33
和targetSdk 33
更新你的项目。 -
3. 在应用程序的清单文件
<application>
标签中添加android:enableOnBackInvokedCallBack="true"
。 -
4. 完成上述步骤后,你的应用程序不应拦截返回手势。
-
5. 此外,你需要从开发者选项中启用该功能,可以按照以下步骤进行操作:
-
• 设置 -> 系统 -> 开发者选项。
-
• 选择“预测式返回动画”。
-
完成上述步骤后,设备/模拟器将准备好显示预测式返回手势动画。
如果你将 OnBackPressedCallback
添加到 onBackPressedDispatcher
,你的应用程序将处理返回按钮点击,onBackPressedDispatcher.onBackPressed()
会被调用,但不会处理滑动返回手势。换句话说,即使启用了 OnBackPressedCallback
,应用程序仍然会执行预测式返回手势动画。
你应该使用 OnBackInvokedCallback
来处理返回到启动器的事件的回调。与其他回调类似,OnBackInvokedDispatcher
处理回调并在需要时调用它,你只需要注册你的回调并在停止处理事件时取消注册。
请注意,与 OnBackPressedCallback
不同,你不能以编程方式触发回调。这是因为回调与系统相关,而不是直接与我们的应用程序相关。因此,你的应用程序只能监听该事件。
通过注册回调,Android 系统将知道你的应用程序将处理该事件,系统将不会执行任何预测式返回手势动画。
资源:
-
• Android 版本 13 新功能:预测式返回手势
https://developer.android.com/about/versions/13/features/predictive-back-gesture
-
• 使用 Gesture Navigation 准备你的应用程序
https://developer.android.com/codelabs/gesture-navigation?hl=en#0
-
• Android 开发者文档:OnBackInvokedDispatcher
https://developer.android.com/reference/android/window/OnBackInvokedDispatcher
Android Android 应用开发 AndroidDev 手势 Androidx