提供自定义返回导航

返回导航是指用户通过界面访问记录实现返回操作的方式。所有 Android 设备都为此类设备提供了返回按钮 导航,因此不要向应用的界面添加“返回”按钮。此按钮可以是物理按钮,也可以是软件按钮,具体取决于用户的 Android 设备。

用户在您的应用中导航时,Android 会维护目的地的返回堆栈。这样,Android 便能正确导航到 返回之前的目的地。不过,也有一些 您的应用可能需要实现自己的“返回”行为 尽可能提供最佳用户体验。

例如,在使用 WebView 时, 那么您可能需要覆盖默认的返回按钮行为 通过浏览网络记录返回到之前的屏幕 。

Android 13 及更高版本包含适用于 Android 设备的预测性返回手势。接收者 如需详细了解此功能,请参阅添加对预测性返回手势的支持

实现自定义返回导航

ComponentActivity,基本 FragmentActivity 的类 和AppCompatActivity, 您可以利用它的 OnBackPressedDispatcher、 您可以通过调用 getOnBackPressedDispatcher() 来检索该路径。

OnBackPressedDispatcher 控制将返回按钮事件分派给一个或多个 OnBackPressedCallback 对象的方式。OnBackPressedCallback 的构造函数利用布尔值指示初始启用状态。启用回调后,即 isEnabled() 返回 true - 调度程序会调用回调的 handleOnBackPressed() 用于处理返回按钮事件。您可以通过调用 setEnabled() 更改启用状态。

使用 addCallback 方法添加回调。我们建议使用 addCallback() 方法,该方法采用 LifecycleOwner。 这可以确保仅在 LifecycleOwnerLifecycle.State.STARTED 时添加 OnBackPressedCallback。如果注册的回调与 LifecycleOwner 会被销毁,这样可以防止内存泄漏并使 适合LifecycleOwner 用于生命周期较短的 fragment 或其他生命周期所有者 比活动活动更重要

下面是一个回调实现示例:

Kotlin

class MyFragment : Fragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // This callback is only called when MyFragment is at least started
        val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
            // Handle the back button event
        }

        // The callback can be enabled or disabled here or in the lambda
    }
    ...
}

Java

public class MyFragment extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // This callback is only called when MyFragment is at least started
        OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
            @Override
            public void handleOnBackPressed() {
                // Handle the back button event
            }
        };
        requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);

        // The callback can be enabled or disabled here or in handleOnBackPressed()
    }
    ...
}

您可以使用 addCallback() 提供多个回调。 调用回调时,回调的调用顺序与 添加它们 - 最后添加的回调是第一个有机会处理 返回按钮事件。例如,如果您添加了三个名为 onetwothree,系统会依次调用它们。 threetwoone

回调遵循责任链模式。责任链中的每个回调仅在前面的回调处于未启用状态时调用。这意味着,在 如上例所示,仅当回调 three 时,系统才会调用 two 回调 未启用,并且仅当回调 two 时才会调用 one 回调 未启用。

请注意,使用 addCallback() 添加回调后, 直到执行完上述操作后,才会将其添加到责任链中。 LifecycleOwner 会进入 Lifecycle.State.STARTED 状态。

建议更改 OnBackPressedCallback 上的启用状态 更改,因为这样做可以保持上述顺序。 如果您在多个位置注册了回调,这一点尤为重要 嵌套的生命周期所有者

如果您想彻底移除 OnBackPressedCallback,可以执行以下操作: 你可以调用 remove()。 通常没必要这样做,因为当回调会自动移除, 与其关联的LifecycleOwner 已销毁

Activity onBackPressed()

如果您使用的是 onBackPressed() 来处理返回按钮事件,我们建议使用 OnBackPressedCallback。 但是,如果您无法进行此项更改,则适用以下规则:

  • 当您调用 super.onBackPressed() 时,系统对通过 addCallback 注册的所有回调进行评估。
  • 在 Android 12(API 级别 32)及更低版本中,始终调用 onBackPressed,而不考虑 OnBackPressedCallback 的任何已注册实例。