Android 生命周期备忘表-第三部分:Fragments
原文链接 The Android Lifecycle cheat sheet — part III : Fragments。
目录
场景 1: 带有 Fragment 的 Activity starts 和 finishes
场景 2: 带有 Fragments 的 Activity 被旋转
Fragments — 场景 3: 带有被保留的 Fragment 的 Activity 被旋转
在本系列文章中:
* 第一部分: Activities — 单个 activity 的生命
* 第二部分: 多个 activities — 多个 activities—导航和返回栈 (本文)
* 第三部分: Fragments— activities 和 fragment 的 生命周期
* 第四部分: ViewModels, Translucent Activities 和 启动模式
这些图表也可作为PDF格式的备忘表提供,以供快速参考。
在本节中,我们将介绍附加到 activity 的 fragment 的行为。不要将此场景与添加到 返回栈 的 fragment 混淆(有关fragment transactions(事务) 和 返回栈 的更多信息,请参阅 Tasks and Back Stack)。
场景 1: 带有 Fragment 的 Activity starts 和 finishes
场景 1: 带有 Fragment 的 Activity starts 和 finishes
请注意,Activity 的 onCreate
可以确保在 Fragment 的(onCreate
)之前执行。但是,并排显示的回调 - 例如 onStart
和 onResume
- 是并行执行的,因此可以按任意顺序被调用。例如,系统可能会在 Fragment 的 onStart
方法之前执行 Activity 的 onStart
方法,但之后在 Activity 的 onResume
方法之前执行 Fragment 的 onResume
方法。
小心管理各个执行序列的时间安排,以避免竞争条件。
场景 2: 带有 Fragments 的 Activity 被旋转
场景 2: 带有 Fragments 的 Activity 被旋转
状态管理
Fragment 状态以与 activity 状态非常相似的方式保存和恢复。区别在于 fragments 中没有 onRestoreInstanceState
,但是在片段的 onCreate
,onCreateView
和 onActivityCreated
中可以使用 Bundle。
可以保留 Fragments,这意味着在配置更改时使用相同的实例。如下一个场景所示,这会稍微改变图表。
Fragments — 场景 3: 带有被保留的 Fragment 的 Activity 被旋转
场景 3: 带有被保留的 Fragment 的 Activity 被旋转
在旋转后 fragment 既不会被销毁也不会被创建,因为在重新创建 activity 后 同样的 fragment 实例被使用。在 onActivityCreated
中状态 bundle 仍然可用。
建议不要使用保留的 fragments,除非它们用于跨配置更改存储数据(在非 UI fragment 中)。这是 Architecture Components(架构组件) 库中的 ViewModel 类在内部使用的,但具有更简单的 API。