Activity 状态变更

用户触发和系统触发的不同事件会导致 Activity从一个状态转换到另一个状态。本文档介绍了发生此类转换的一些常见情况,以及如何处理这些转换。

如需详细了解 activity 状态,请参阅 activity 生命周期。如需了解如何借助 ViewModel 类来管理 activity 生命周期,请参阅 ViewModel 概览

对于大多数 activity 更改,您无需直接响应 activity 生命周期中的回调。由于 Compose 会根据状态重建界面,因此您可以 利用自动重组功能,方法是确保状态存储在 适当的位置,例如 rememberSaveableViewModel

配置发生了更改

有很多事件会触发配置更改。最显著的例子或许是横屏和竖屏之间的屏幕方向变化。其他情况,如语言设置或输入设备的改变等,也可能导致配置更改。

当配置发生更改时,activity 会被销毁并重新创建。 这会在原始 activity 实例中触发以下回调:

  1. onPause
  2. onStop
  3. onDestroy

系统会创建新的 activity 实例,并触发以下回调:

  1. onCreate
  2. onStart
  3. onResume

在 Compose 中,通常不会直接与这些回调进行交互。而是使用 Lifecycle API 来观察状态变化。在 Compose 中,您可以使用 LocalLifecycleOwner.current 获取当前生命周期并添加观察器,以便响应事件。

结合使用 ViewModel 实例、rememberSaveable 或持久性本地存储,可使 activity 的界面状态在配置发生更改后保持不变。 在决定如何组合这些选项时,需要考虑界面数据的复杂程度、应用的用例以及检索速度与内存用量的权衡。对于大多数用例,您应将状态提升到 ViewModel 中,并使用 rememberSaveable 来确保状态在配置更改和系统发起的进程终止后保持不变。如需详细了解如何保存 activity 界面状态,请参阅保存界面状态

当 activity 因配置更改而重新创建时,初始组合会被处置。使用 ViewModelrememberSaveable 可确保界面状态在新组合中恢复。

如需了解详情,请参阅 Jetpack Compose 中的生命周期以及状态和 Jetpack Compose

处理多窗口模式的情况

一旦应用进入多窗口模式(适用于 Android 7.0(API 级别 24)及更高级别),系统会向运行中的 activity 发送配置更改通知,从而完成之前所述的生命周期转换。

如果已经处于多窗口模式的应用调整了大小,也会出现这种行为。 您的 activity 可以自行处理配置更改,也可以让系统销毁 activity 并使用新维度重新创建一个。

如需详细了解多窗口模式生命周期,请参阅 支持多窗口模式中有关多窗口模式生命周期的说明。

在多窗口模式下,虽然用户可以看到两个应用,但只有与用户交互的应用位于前台且具有焦点。 该 activity 处于“已恢复”状态,而另一个窗口中的应用则处于“已暂停”状态。

当用户从应用 A 切换到应用 B 时,系统会对onPause应用 A 调用,对onResume应用 B 调用。每当用户在应用之间切换时,系统就会在这两种方法之间切换。

如需详细了解多窗口模式,请参阅 支持多窗口模式

Activity 或对话框显示在前台

如果有新的 activity 或对话框出现在前台,并且局部覆盖了正在进行的 activity,则被覆盖的 activity 会失去焦点并进入“已暂停”状态。然后,系统会对该 activity 调用 onPause

当被覆盖的 activity 返回到前台并重新获得焦点时,系 统会调用 onResume

如果有新的 activity 或对话框出现在前台,夺取了焦点且完全覆盖了正在进行的 activity,则被覆盖的 activity 会失去焦点并进入“已停止”状态。然后,系统会快速地接连调用 onPauseonStop

当被覆盖的 activity 的同一实例返回到前台时,系统会对该 activity 调用 onRestartonStartonResume。如果被覆盖的 activity 的新实例进入后台,则系统不会调用 onRestart,而只会调用 onStartonResume

重组不受显示在前台的对话框的影响。不过, 与生命周期相关的副作用(例如流和动画)应使用 生命周期感知型 API(例如 collectAsStateWithLifecycle),以便 根据需要自动暂停和恢复工作。如需了解详情,请参阅 状态 和 Jetpack Compose

用户点按或手势返回

如果 activity 位于前台,并且用户点按或手势返回,则 activity 将依次经历 onPauseonStoponDestroy 回调。activity 会被销毁并从返回堆栈中移除。

在单 activity 应用(例如大多数 Compose 应用)中,如果可组合项从导航返回堆栈中移除,rememberSaveable 将不会维护状态。这是因为,当用户点按“返回”时,系统不会期望用户返回到同一实例,因此所有状态都会被清除。

如需实现自定义返回行为(例如显示一个对话框,要求用户确认是否要退出应用),请使用 NavigationEventHandler API。

系统终止应用进程

如果应用处于后台并且系统需要为前台应用释放内存,则系统可以终止后台应用。当系统终止应用时,无法保证在应用中调用 onDestroy

如需详细了解系统如何确定要销毁哪些进程,请参阅 activity 状态和从内存中弹出以及进程和应用 生命周期

如需了解如何在系统终止您的应用 进程时保存 activity 界面状态,请参阅保存和恢复暂时性界面状态