Android 生命周期备忘表-第一部分:单一 Activities
翻译自 The Android Lifecycle cheat sheet — part I: Single Activities。
Android 旨在为用户提供支持,让他们以直观的方式使用 apps。 例如,一个 app 的用户可能会旋转屏幕,响应通知或切换到其他任务,他们应该能够在此类事件之后无缝地继续使用 app。
为了提供这种用户体验,您应该知道如何管理组件生命周期。组件可以是 Activity,Fragment,Service,Application 本身,甚至是底层进程。组件有一个生命周期,在这个生命周期中,它通过状态进行转换。每当发生转换时,系统都会通过生命周期回调方法通知您。
为了帮助我们解释生命周期是如何工作的,我们定义了一系列场景,这些场景根据存在的组件进行分组:
第一部分: Activities — 单个 activity 的生命周期 (本文)
第三部分: Fragments — activity 和 fragment 的生命周期
第四部分: ViewModels, Translucent Activities 和 启动模式
这些图表也可作为PDF格式的备忘表提供,以供快速参考。
注意:这些图表适用于Android P / Jetpack 1.0行为。
除非另有说明,否则以下方案将展示组件的默认行为。
第一部分: Activities
单个 Activity — 场景 1: App 被 finished 并 restarted
由以下操作触发:
- 用户按下 返回按钮, 或者
-
Activity.finish()
方法被调用
这个最简单的场景展示了当只有单个 activity 的应用程序被用户 started,finished 和 restarted 会发生什么:
场景 1: App 被 finished 和 restarted
管理状态
-
onSaveInstanceState
没有被调用 (因为 activity 被 finished 了, 所以你无需保存状态) -
onCreate
重新打开 app 时没有 Bundle,因为 activity 已经 finished 了并且状态不需要被恢复。
单个 Activity — 场景 2: 用户导航离开
由以下操作触发:
- 用户按下 Home 按钮
- 用户切换到另一个 app (通过 Overview 菜单,通知,接听电话等)
场景 2: 用户导航离开
在这种情况下,系统将 stop 该 activity,但不会立即 finish 它。
管理状态
当您的 activity 进入Stopped 状态时,系统使用 onSaveInstanceState 来保存 app 状态,以防系统稍后杀死 app 的进程(见下文)。
假设进程未被终止,则 activity 实例将保留在内存中,保留所有状态。 当 activity 返回到前台时,activity 会调用此信息。您无需重新初始化先前创建的组件。
单个 Activity — 场景 3: 配置更改
由以下操作触发:
- 配置更改,如旋转
- 用户在多窗口模式下调整窗口大小
场景 3: 旋转和其他配置更改
管理状态
配置更改(如旋转或窗口大小调整)应允许用户准确地在停止的位置继续。
- Activity 被完全 destroyed,但是状态已被保存下来并为新实例恢复了状态。
-
onCreate
和onRestoreInstanceState
中的 Bundle 是相同的。
单个 Activity — 场景 4: App 被系统 paused
由以下操作触发:
- 启用多窗口模式(API 24+)并失去焦点
- 另一个 app 部分遮盖了正在运行的 app(购买对话框,运行时权限对话框,第三方登录对话框...)
- 出现了 intent 选择器,例如分享对话框
场景 4: App 被系统 paused
此场景不适用与:
- 同一个 app 中的对话框。显示
AlertDialog
或DialogFragment
不会 pause 下层的 activity。 - 通知。用户收到新通知或下拉通知栏不会 pause 下层的 activity。
(在 P 上,onSaveInstanceState 是在 onStop 之后被调用的)。