返回导航是指用户通过界面访问记录实现返回操作的方式。所有 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
的任何已注册实例。