生命周期
生命周期

生命周期

生命周期阶段

ca808edb1c95f07a.png

在 activity 生命周期状态发生变化时,您通常需要更改某些行为,或者运行一些代码。因此,Activity 类本身以及 Activity 的任何子类(例如 ComponentActivity)都会实现一组生命周期回调方法。Android 会在 activity 从一种状态切换为另一种状态时调用这些回调,而您可以在自己的 activity 中替换这些方法,通过执行任务来响应这些生命周期状态变化。下图显示了生命周期状态以及可用的可替换回调。

activity 生命周期方案

注意:onRestart() 方法上的星号表示,每次状态在 Created 和 Started 之间转换时,系统都不会调用此方法。仅当调用 onStop() 并且随后重启 activity 时,系统才会调用此方法。

当 activity 从头开始启动时,您会看到系统按顺序调用以下三个生命周期回调:

  • onCreate(),在系统创建应用时调用。
  • onStart(),使应用显示在屏幕上,但用户无法与应用进行交互。
  • onResume(),将应用置于前台,用户现在可以与应用交互。

onResume() 方法尽管名称是这样,但会在启动时调用,即使没有要恢复的 activity 也是如此。

配置变更会导致系统调用 onDestroy()

屏幕旋转是导致 activity 关闭并重启的一种配置变更类型。如需模拟此配置变更并检查其影响,请完成以下步骤:

  1. 编译并运行您的应用。
  2. 确保已停用模拟器中的屏幕旋转锁定功能。
  3. 将设备或模拟器旋转为横屏模式。您可以使用旋转按钮向左或向右旋转模拟器。
  4. 检查 Logcat,注意当 activity 关闭时,它会依次调用 onPause()、onStop() 和 onDestroy()

可组合项的生命周期

应用的界面最初是通过在名称为 Composition 的进程中运行可组合函数而构建的。

当应用的状态发生更改时,系统会安排重组。重组是指 Compose 重新执行状态可能已发生变化的可组合函数,并创建更新后的界面。系统会更新 Composition 以反映这些更改。

创建或更新 Composition 的唯一方法是通过其初始组合和后续重组。

可组合函数有自己的生命周期,并且其生命周期独立于 activity 生命周期。其生命周期由多个事件组成:进入 Composition,重组 0 次或多次,然后退出 Composition。

为了让 Compose 能够跟踪和触发重组,它需要知晓状态何时发生了更改。如需向 Compose 指示它应当跟踪某个对象的状态,该对象的类型必须为 State 或 MutableState。State 类型不可变,仅允许读取。MutableState 类型是可变的,并且允许读取和写入。

在之前的 Codelab 中,您已在 Lemonade 应用和 Tip Time 应用中看到和使用过 MutableState。

如需创建可变变量 revenue,请使用 mutableStateOf 声明该变量。0 是它的初始默认值。

var revenue = mutableStateOf(0)

尽管这足以让 Compose 在收入值发生更改时触发重组,但保留更新后的值是不够的。每次重新执行可组合项时,该收入值都会重新初始化为初始默认值 0。

如需指示 Compose 在重组期间保留并重复使用其值,您需要使用 remember API 进行声明。

var revenue by remember { mutableStateOf(0) }

如果 revenue 的值发生更改,Compose 会安排读取此值的所有可组合函数进行重组。

尽管 Compose 会在重组期间记住收入状态,但在配置变更期间不会保留此状态。为了让 Compose 在配置更改期间保留状态,您必须使用 rememberSaveable。

如需了解其他做法和信息,请参阅 Compose 中的状态简介 Codelab。

在配置变量期间使用 rememberSaveable 保存值

当 Android OS 销毁并重新创建 activity 时,您可以使用 rememberSaveable 函数保存所需的值。

如需在重组期间保存值,您需要使用 remember。在重组和配置更改期间使用 rememberSaveable 保存值。

注意:有时,Android 会关闭整个应用进程,包括与应用相关联的每个 activity。Android 会在系统承受压力并面临视觉延迟风险时执行此类关闭操作,因此此时不会运行额外的回调或代码。应用的进程只会在后台静默地关闭。但对用户来说,应用似乎并没有关闭。当用户返回 Android 系统已关闭的应用时,Android 会重启相应应用。您需要确保发生这种情况时不会对用户造成任何数据损失。

使用 rememberSaveable 保存值可确保该值在 activity 恢复时可用(如果需要的话)。

  1. 在 MainActivity 中,将当前使用 remember 的五个变量更新为 rememberSaveable。
var revenue by remember { mutableStateOf(0) }
...
var currentDessertImageId by remember {
    mutableStateOf(desserts[currentDessertIndex].imageId)
}
var revenue by rememberSaveable { mutableStateOf(0) }
...
var currentDessertImageId by rememberSaveable {
    mutableStateOf(desserts[currentDessertIndex].imageId)
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注