Fragment添加与状态变更时序图

21 阅读1分钟

Fragment添加与状态变更时序图

sequenceDiagram
    participant Activity
    participant FragmentManager
    participant FragmentTransaction
    participant FragmentStateManager
    participant Fragment

    Note over Activity,Fragment: Fragment添加阶段

    Activity->>FragmentManager: getSupportFragmentManager()
    FragmentManager-->>Activity: return FragmentManager实例

    Activity->>FragmentManager: beginTransaction()
    FragmentManager->>FragmentTransaction: 创建FragmentTransaction
    FragmentTransaction-->>Activity: return FragmentTransaction

    Activity->>FragmentTransaction: add(containerId, fragment)
    FragmentTransaction->>FragmentTransaction: 记录Op操作

    Activity->>FragmentTransaction: commit()
    FragmentTransaction->>FragmentManager: 提交事务

    Note over FragmentManager,Fragment: Fragment状态管理阶段

    FragmentManager->>FragmentManager: executeOps()
    FragmentManager->>FragmentStateManager: 创建FragmentStateManager(fragment)

    FragmentManager->>FragmentStateManager: addFragment()
    FragmentStateManager->>FragmentStateManager: computeExpectedState()

    Note over FragmentStateManager,Fragment: 状态变更: INITIALIZING -> ATTACHED

    FragmentStateManager->>Fragment: onAttach(context)
    Fragment-->>FragmentStateManager: 完成attach
    FragmentStateManager->>Activity: onAttachFragment(fragment)

    Note over FragmentStateManager,Fragment: 状态变更: ATTACHED -> CREATED

    FragmentStateManager->>Fragment: onCreate(savedInstanceState)
    Fragment-->>FragmentStateManager: 完成create

    Note over FragmentStateManager,Fragment: 状态变更: CREATED -> VIEW_CREATED

    FragmentStateManager->>Fragment: onCreateView(inflater, container, savedInstanceState)
    Fragment-->>FragmentStateManager: return View
    FragmentStateManager->>Fragment: onViewCreated(view, savedInstanceState)

    Note over FragmentStateManager,Fragment: 状态变更: VIEW_CREATED -> ACTIVITY_CREATED

    FragmentStateManager->>Fragment: onActivityCreated(savedInstanceState)
    Fragment-->>FragmentStateManager: 完成activityCreated

    Note over FragmentStateManager,Fragment: 状态变更: ACTIVITY_CREATED -> STARTED

    FragmentStateManager->>Fragment: onStart()
    Fragment-->>FragmentStateManager: 完成start

    Note over FragmentStateManager,Fragment: 状态变更: STARTED -> RESUMED

    FragmentStateManager->>Fragment: onResume()
    Fragment-->>FragmentStateManager: 完成resume

    FragmentStateManager->>FragmentManager: 更新Fragment状态
    FragmentManager->>Activity: Fragment已就绪

    Note over Activity,Fragment: Fragment完全显示,处于RESUMED状态

    Note over Activity,Fragment: ========== Activity生命周期驱动Fragment状态变更 ==========

    Note over Activity,Fragment: 场景1: Activity暂停(如锁屏、跳转到其他Activity)

    Activity->>Activity: onPause()
    Activity->>FragmentManager: dispatchPause()
    FragmentManager->>FragmentStateManager: moveToState(STARTED)

    Note over FragmentStateManager,Fragment: 状态变更: RESUMED -> STARTED

    FragmentStateManager->>Fragment: onPause()
    Fragment-->>FragmentStateManager: 完成pause
    FragmentStateManager->>FragmentManager: 状态已更新

    Note over Activity,Fragment: 场景2: Activity停止(完全不可见)

    Activity->>Activity: onStop()
    Activity->>FragmentManager: dispatchStop()
    FragmentManager->>FragmentStateManager: moveToState(ACTIVITY_CREATED)

    Note over FragmentStateManager,Fragment: 状态变更: STARTED -> ACTIVITY_CREATED

    FragmentStateManager->>Fragment: onStop()
    Fragment-->>FragmentStateManager: 完成stop
    FragmentStateManager->>FragmentManager: 状态已更新

    Note over Activity,Fragment: 场景3: Activity销毁

    Activity->>Activity: onDestroy()
    Activity->>FragmentManager: dispatchDestroy()
    FragmentManager->>FragmentStateManager: moveToState(INITIALIZING)

    Note over FragmentStateManager,Fragment: 状态变更: ACTIVITY_CREATED -> VIEW_CREATED

    FragmentStateManager->>Fragment: onDestroyView()
    Fragment-->>FragmentStateManager: 完成destroyView

    Note over FragmentStateManager,Fragment: 状态变更: VIEW_CREATED -> CREATED

    FragmentStateManager->>Fragment: onDestroy()
    Fragment-->>FragmentStateManager: 完成destroy

    Note over FragmentStateManager,Fragment: 状态变更: CREATED -> ATTACHED

    FragmentStateManager->>Fragment: onDetach()
    Fragment-->>FragmentStateManager: 完成detach

    FragmentStateManager->>FragmentManager: Fragment已销毁
    FragmentManager->>FragmentManager: 移除Fragment引用

    Note over Activity,Fragment: 场景4: Activity重新启动(从后台返回)

    Activity->>Activity: onRestart()
    Activity->>Activity: onStart()
    Activity->>FragmentManager: dispatchStart()
    FragmentManager->>FragmentStateManager: moveToState(STARTED)

    Note over FragmentStateManager,Fragment: 状态变更: ACTIVITY_CREATED -> STARTED

    FragmentStateManager->>Fragment: onStart()
    Fragment-->>FragmentStateManager: 完成start

    Activity->>Activity: onResume()
    Activity->>FragmentManager: dispatchResume()
    FragmentManager->>FragmentStateManager: moveToState(RESUMED)

    Note over FragmentStateManager,Fragment: 状态变更: STARTED -> RESUMED

    FragmentStateManager->>Fragment: onResume()
    Fragment-->>FragmentStateManager: 完成resume
    FragmentStateManager->>FragmentManager: 状态已更新

    Note over Activity,Fragment: Fragment再次完全显示,处于RESUMED状态

    Note over Activity,Fragment: 场景5: 配置变更(如屏幕旋转)

    Activity->>Activity: onSaveInstanceState()
    Activity->>FragmentManager: dispatchSaveInstanceState()
    FragmentManager->>FragmentStateManager: saveState()
    FragmentStateManager->>Fragment: onSaveInstanceState(outState)
    Fragment-->>FragmentStateManager: 保存状态数据

    Note over Activity,Fragment: Activity销毁并重建

    Activity->>FragmentManager: dispatchDestroy()
    Note over FragmentManager,Fragment: Fragment执行销毁流程(同场景3)

    Activity->>Activity: 新Activity onCreate()
    Activity->>FragmentManager: 恢复FragmentManager状态
    FragmentManager->>FragmentStateManager: 重建Fragment
    FragmentStateManager->>Fragment: onCreate(savedInstanceState)
    Note over FragmentManager,Fragment: Fragment重新执行创建流程(同初始添加阶段)

说明

主要流程

  1. 事务创建阶段

    • Activity通过FragmentManager获取FragmentTransaction
    • 调用add()方法记录添加操作
    • 调用commit()提交事务
  2. 状态管理阶段

    • FragmentManager创建FragmentStateManager来管理Fragment状态
    • FragmentStateManager负责驱动Fragment的生命周期状态变更
  3. 生命周期状态变更(向上)

    • INITIALIZING → ATTACHED:调用onAttach()
    • ATTACHED → CREATED:调用onCreate()
    • CREATED → VIEW_CREATED:调用onCreateView()和onViewCreated()
    • VIEW_CREATED → ACTIVITY_CREATED:调用onActivityCreated()
    • ACTIVITY_CREATED → STARTED:调用onStart()
    • STARTED → RESUMED:调用onResume()
  4. Activity驱动Fragment状态变更

    • 暂停场景:Activity.onPause() → FragmentManager.dispatchPause() → Fragment.onPause()
    • 停止场景:Activity.onStop() → FragmentManager.dispatchStop() → Fragment.onStop()
    • 销毁场景:Activity.onDestroy() → FragmentManager.dispatchDestroy() → Fragment依次执行onDestroyView()、onDestroy()、onDetach()
    • 恢复场景:Activity重启时,通过dispatchStart()和dispatchResume()驱动Fragment恢复到RESUMED状态
    • 配置变更:Activity在销毁前保存Fragment状态,重建后恢复Fragment
  5. Fragment状态与Activity生命周期的对应关系

    • Activity RESUMED → Fragment RESUMED
    • Activity STARTED → Fragment STARTED
    • Activity CREATED → Fragment ACTIVITY_CREATED
    • Activity DESTROYED → Fragment INITIALIZING

关键类职责

  • Activity:宿主容器,生命周期变化时通过FragmentManager分发事件驱动Fragment状态同步变更
  • FragmentManager:管理Fragment集合,接收Activity生命周期事件并协调Fragment状态转换
  • FragmentTransaction:记录Fragment操作,提交事务
  • FragmentStateManager:管理单个Fragment的状态变更,调用moveToState()执行状态转换
  • Fragment:UI组件,响应生命周期回调

状态转换关键点

  • Fragment的状态始终不会超过其宿主Activity的状态
  • FragmentManager通过dispatch系列方法(dispatchPause/Stop/Destroy/Start/Resume)同步Activity生命周期到Fragment
  • FragmentStateManager根据目标状态计算需要执行的生命周期方法序列
  • 配置变更时,Fragment状态会被保存并在Activity重建后恢复