Android Lifecycle 时序图
1. Activity 启动到销毁的生命周期
sequenceDiagram
participant S as System
participant A as Activity
participant R as Registry
participant O as Observer
Note over S,O: 启动流程
S->>A: onCreate()
A->>R: handleLifecycleEvent(ON_CREATE)
R->>R: setState(CREATED)
R->>O: onStateChanged(ON_CREATE)
O->>O: onCreate()
S->>A: onStart()
A->>R: handleLifecycleEvent(ON_START)
R->>R: setState(STARTED)
R->>O: onStateChanged(ON_START)
O->>O: onStart()
S->>A: onResume()
A->>R: handleLifecycleEvent(ON_RESUME)
R->>R: setState(RESUMED)
R->>O: onStateChanged(ON_RESUME)
O->>O: onResume()
Note over A: Activity 可见且可交互
Note over S,O: 退出流程
S->>A: onPause()
A->>R: handleLifecycleEvent(ON_PAUSE)
R->>R: setState(STARTED)
R->>O: onStateChanged(ON_PAUSE)
O->>O: onPause()
S->>A: onStop()
A->>R: handleLifecycleEvent(ON_STOP)
R->>R: setState(CREATED)
R->>O: onStateChanged(ON_STOP)
O->>O: onStop()
S->>A: onDestroy()
A->>R: handleLifecycleEvent(ON_DESTROY)
R->>R: setState(DESTROYED)
R->>O: onStateChanged(ON_DESTROY)
O->>O: onDestroy()
2. Fragment 生命周期
sequenceDiagram
participant FM as FragmentManager
participant F as Fragment
participant FR as Fragment Registry
participant VR as View Registry
participant O as Observer
Note over FM,O: Fragment 创建
FM->>F: onCreate()
F->>FR: handleLifecycleEvent(ON_CREATE)
FR->>FR: setState(CREATED)
FR->>O: onCreate()
FM->>F: onCreateView()
F->>F: inflate layout
F-->>FM: return View
FM->>F: onViewCreated()
F->>VR: create ViewLifecycleOwner
VR->>VR: setState(CREATED)
VR->>O: onCreate()
FM->>F: onStart()
F->>FR: handleLifecycleEvent(ON_START)
FR->>FR: setState(STARTED)
F->>VR: handleLifecycleEvent(ON_START)
VR->>VR: setState(STARTED)
FM->>F: onResume()
F->>FR: handleLifecycleEvent(ON_RESUME)
FR->>FR: setState(RESUMED)
F->>VR: handleLifecycleEvent(ON_RESUME)
VR->>VR: setState(RESUMED)
Note over F: Fragment 可见且可交互
Note over FM,O: Fragment 销毁
FM->>F: onPause()
F->>FR: handleLifecycleEvent(ON_PAUSE)
F->>VR: handleLifecycleEvent(ON_PAUSE)
FM->>F: onStop()
F->>FR: handleLifecycleEvent(ON_STOP)
F->>VR: handleLifecycleEvent(ON_STOP)
FM->>F: onDestroyView()
F->>VR: handleLifecycleEvent(ON_DESTROY)
VR->>VR: setState(DESTROYED)
VR->>O: onDestroy()
FM->>F: onDestroy()
F->>FR: handleLifecycleEvent(ON_DESTROY)
FR->>FR: setState(DESTROYED)
FR->>O: onDestroy()
3. 注册 Observer 的流程
sequenceDiagram
participant App as 应用代码
participant Owner as LifecycleOwner
participant LC as Lifecycle
participant R as Registry
participant O as Observer
App->>O: 创建 Observer
App->>Owner: getLifecycle()
Owner-->>App: return Lifecycle
App->>LC: addObserver(observer)
LC->>R: addObserver(observer)
R->>R: 包装为 ObserverWithState
R->>R: observerMap.put()
R->>O: onStateChanged(currentState)
O->>O: 执行回调方法
4. 生命周期事件分发流程
sequenceDiagram
participant A as Activity
participant R as Registry
participant O1 as Observer1
participant O2 as Observer2
participant O3 as Observer3
A->>R: handleLifecycleEvent(ON_CREATE)
R->>R: moveToState(CREATED)
R->>R: sync()
R->>O1: onStateChanged(ON_CREATE)
O1->>O1: onCreate()
R->>O2: onStateChanged(ON_CREATE)
O2->>O2: onCreate()
R->>O3: onStateChanged(ON_CREATE)
O3->>O3: onCreate()
Note over R: 所有 Observer 通知完成
5. lifecycleScope 协程生命周期
sequenceDiagram
participant App as 应用代码
participant A as Activity
participant R as Registry
participant LS as lifecycleScope
participant C as Coroutine
Note over App,C: 启动协程
App->>LS: launch { }
LS->>C: 创建并启动协程
Note over A,C: Activity 运行中
A->>R: onResume()
R->>R: setState(RESUMED)
Note over C: 协程执行
Note over A,C: Activity 销毁
A->>R: onDestroy()
R->>R: setState(DESTROYED)
R->>LS: 触发取消
LS->>C: cancel()
C->>C: 清理资源
6. 配置变更(旋转屏幕)流程
sequenceDiagram
participant S as System
participant A1 as Activity(旧)
participant R1 as Registry(旧)
participant A2 as Activity(新)
participant R2 as Registry(新)
Note over S,R2: 配置变更触发
S->>A1: onPause()
A1->>R1: ON_PAUSE
S->>A1: onStop()
A1->>R1: ON_STOP
S->>A1: onDestroy()
A1->>R1: ON_DESTROY
R1->>R1: setState(DESTROYED)
Note over A1,R1: 旧实例销毁
S->>A2: 创建新实例
S->>A2: onCreate()
A2->>R2: ON_CREATE
R2->>R2: setState(CREATED)
S->>A2: onStart()
A2->>R2: ON_START
S->>A2: onResume()
A2->>R2: ON_RESUME
R2->>R2: setState(RESUMED)
Note over A2,R2: 新实例运行
7. MainActivity 启动 FirstFragment
sequenceDiagram
participant S as System
participant MA as MainActivity
participant FM as FragmentManager
participant FF as FirstFragment
participant FR as Fragment Registry
S->>MA: onCreate()
MA->>FM: beginTransaction()
MA->>FM: add(R.id.container, FirstFragment)
FM->>FF: 创建实例
FF->>FR: 创建 Registry
FM->>FF: onCreate()
FF->>FR: handleLifecycleEvent(ON_CREATE)
FR->>FR: setState(CREATED)
FM->>FF: onCreateView()
FF->>FF: inflate(R.layout.fragment_first)
FM->>FF: onViewCreated()
FF->>FF: 初始化 View
S->>MA: onStart()
MA->>FM: dispatchStart()
FM->>FF: onStart()
FF->>FR: handleLifecycleEvent(ON_START)
S->>MA: onResume()
MA->>FM: dispatchResume()
FM->>FF: onResume()
FF->>FR: handleLifecycleEvent(ON_RESUME)
Note over FF: Fragment 可见且可交互
8. ViewModel 与 Lifecycle 交互
sequenceDiagram
participant A as Activity
participant VP as ViewModelProvider
participant VS as ViewModelStore
participant VM as ViewModel
participant R as Registry
A->>VP: ViewModelProvider(this)
A->>VP: get(MyViewModel::class.java)
VP->>VS: get(key)
alt ViewModel 不存在
VS->>VM: 创建 ViewModel
VM->>VM: init
VS->>VS: put(key, viewModel)
end
VP-->>A: return ViewModel
Note over A: Activity 运行
A->>R: onDestroy()
R->>R: setState(DESTROYED)
alt isFinishing = true
R->>VS: clear()
VS->>VM: onCleared()
VM->>VM: 清理资源
end
生命周期状态转换
State 枚举值
- INITIALIZED: 初始状态
- CREATED: onCreate() 之后
- STARTED: onStart() 之后
- RESUMED: onResume() 之后
- DESTROYED: onDestroy() 之后
Event 枚举值
- ON_CREATE: 触发 onCreate()
- ON_START: 触发 onStart()
- ON_RESUME: 触发 onResume()
- ON_PAUSE: 触发 onPause()
- ON_STOP: 触发 onStop()
- ON_DESTROY: 触发 onDestroy()
- ON_ANY: 任意事件
时序图说明
图1:Activity 生命周期
展示 Activity 从启动到销毁的标准流程,包括 LifecycleRegistry 如何管理状态变化和通知 Observer。
图2:Fragment 生命周期
Fragment 有两个独立的生命周期:
- Fragment 自身的生命周期(由 Fragment Registry 管理)
- View 的生命周期(由 ViewLifecycleOwner 管理)
图3:Observer 注册
展示应用代码如何注册 Observer,以及 Registry 如何立即同步当前状态。
图4:事件分发
展示当生命周期事件发生时,Registry 如何按顺序通知所有已注册的 Observer。
图5:lifecycleScope
展示协程作用域如何与生命周期绑定,在 onDestroy 时自动取消所有协程。
图6:配置变更
展示配置变更时,旧 Activity 实例完全销毁,新实例重新创建的过程。
图7:MainActivity 和 Fragment
展示项目中 MainActivity 如何启动和管理 FirstFragment。
图8:ViewModel 生命周期
展示 ViewModel 如何通过 ViewModelStore 保持数据,在配置变更时存活。
关键点
- 状态同步: 当注册 Observer 时,会立即同步到当前状态
- 顺序通知: 所有 Observer 按注册顺序接收事件
- 自动清理: lifecycleScope 在 onDestroy 时自动取消
- 双重生命周期: Fragment 有自身和 View 两个生命周期
- 配置变更: Activity 重建时 ViewModel 可以保持数据