提供自定义返回导航

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

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

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

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

实现自定义返回导航

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

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

使用 addCallback 方法添加回调。我们建议使用 addCallback() 方法,该方法采用 LifecycleOwner。 这可以确保仅在 LifecycleOwner 为 Lifecycle.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() 提供多个回调。 调用回调时,回调的调用顺序与 添加它们 - 最后添加的回调是第一个有机会处理 返回按钮事件。例如,如果您添加了三个名为 one、two 和 three,系统会依次调用它们。 three、two、one。

回调遵循责任链模式。责任链中的每个回调仅在前面的回调处于未启用状态时调用。这意味着,在 如上例所示,仅当回调 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 的任何已注册实例。