用户触发和系统触发的不同事件会导致
Activity从一个状态转换到另一个状态。本文档介绍了发生此类转换的一些常见情况,以及如何处理这些转换。
如需详细了解 activity 状态,请参阅 activity 生命周期。如需了解如何借助 ViewModel 类来管理 activity
生命周期,请参阅 ViewModel 概览。
对于大多数 activity 更改,您无需直接响应 activity 生命周期中的回调。由于 Compose 会根据状态重建界面,因此您可以
利用自动重组功能,方法是确保状态存储在
适当的位置,例如 rememberSaveable 或 ViewModel。
配置发生了更改
有很多事件会触发配置更改。最显著的例子或许是横屏和竖屏之间的屏幕方向变化。其他情况,如语言设置或输入设备的改变等,也可能导致配置更改。
当配置发生更改时,activity 会被销毁并重新创建。 这会在原始 activity 实例中触发以下回调:
系统会创建新的 activity 实例,并触发以下回调:
在 Compose 中,通常不会直接与这些回调进行交互。而是使用 Lifecycle API 来观察状态变化。在 Compose 中,您可以使用 LocalLifecycleOwner.current 获取当前生命周期并添加观察器,以便响应事件。
结合使用 ViewModel 实例、rememberSaveable 或持久性本地存储,可使 activity 的界面状态在配置发生更改后保持不变。
在决定如何组合这些选项时,需要考虑界面数据的复杂程度、应用的用例以及检索速度与内存用量的权衡。对于大多数用例,您应将状态提升到 ViewModel 中,并使用 rememberSaveable 来确保状态在配置更改和系统发起的进程终止后保持不变。如需详细了解如何保存
activity 界面状态,请参阅保存界面状态。
当 activity 因配置更改而重新创建时,初始组合会被处置。使用 ViewModel 或 rememberSaveable 可确保界面状态在新组合中恢复。
如需了解详情,请参阅 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 会失去焦点并进入“已停止”状态。然后,系统会快速地接连调用
onPause 和 onStop。
当被覆盖的 activity 的同一实例返回到前台时,系统会对该
activity 调用 onRestart、onStart 和 onResume。如果被覆盖的 activity 的新实例进入后台,则系统不会调用 onRestart,而只会调用 onStart 和 onResume。
重组不受显示在前台的对话框的影响。不过,
与生命周期相关的副作用(例如流和动画)应使用
生命周期感知型 API(例如 collectAsStateWithLifecycle),以便
根据需要自动暂停和恢复工作。如需了解详情,请参阅 状态
和 Jetpack Compose。
用户点按或手势返回
如果 activity 位于前台,并且用户点按或手势返回,则
activity 将依次经历 onPause、onStop 和
onDestroy 回调。activity 会被销毁并从返回堆栈中移除。
在单 activity 应用(例如大多数 Compose 应用)中,如果可组合项从导航返回堆栈中移除,rememberSaveable 将不会维护状态。这是因为,当用户点按“返回”时,系统不会期望用户返回到同一实例,因此所有状态都会被清除。
如需实现自定义返回行为(例如显示一个对话框,要求用户确认是否要退出应用),请使用 NavigationEventHandler API。
系统终止应用进程
如果应用处于后台并且系统需要为前台应用释放内存,则系统可以终止后台应用。当系统终止应用时,无法保证在应用中调用 onDestroy。
如需详细了解系统如何确定要销毁哪些进程,请参阅 activity 状态和从内存中弹出以及进程和应用 生命周期。
如需了解如何在系统终止您的应用 进程时保存 activity 界面状态,请参阅保存和恢复暂时性界面状态。