Android Lifecycle 时序图

0 阅读2分钟

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 保持数据,在配置变更时存活。

关键点

  1. 状态同步: 当注册 Observer 时,会立即同步到当前状态
  2. 顺序通知: 所有 Observer 按注册顺序接收事件
  3. 自动清理: lifecycleScope 在 onDestroy 时自动取消
  4. 双重生命周期: Fragment 有自身和 View 两个生命周期
  5. 配置变更: Activity 重建时 ViewModel 可以保持数据