一句话说透Android里面的Fragment的生命周期

329 阅读4分钟

一句话总结

Fragment 的生命周期就像员工的“入职到离职”流程——从加入公司(关联 Activity)到布置工位(加载界面)、开始工作(用户可见)、摸鱼暂停(不可见),最后离职(销毁),每个阶段都有明确的任务。


生命周期流程图

入职 → 领工牌 → 布置工位 → 开工 → 摸鱼 → 下班 → 离职  
onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume → onPause → onStop → onDestroyView → onDestroy → onDetach

各个阶段的“任务清单”(生命周期方法)

1. 入职(onAttach)

  • 做什么

    • 绑定公司(关联到 Activity)。
    • 拿到公司资源(获取 Activity 的上下文 Context)。
  • 注意
    这是 Fragment 和 Activity 建立关系的起点,可以在这里获取 Activity 传递的参数。


2. 领工牌(onCreate)

  • 做什么

    • 初始化基础信息(比如数据加载、配置参数)。
    • 但此时工位还没布置(不能操作 UI)。
  • 场景

    • 从保存的状态(如屏幕旋转)恢复数据。
    • 初始化非 UI 相关的对象(如数据库连接)。

3. 布置工位(onCreateView)

  • 做什么

    • 搭建工位布局(加载 XML 布局文件)。
    • 返回布局的根视图(return inflater.inflate(...))。
  • 注意
    避免在这里直接操作 UI 组件(比如 findViewById),因为视图可能未完全初始化。


4. 工位验收(onViewCreated)

  • 做什么

    • 检查工位设备(初始化 UI 组件,如 TextView、Button)。
    • 连接网络、打印机(绑定事件监听、请求数据)。
  • 代码示例

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val textView = view.findViewById<TextView>(R.id.text_view)
        textView.text = "工位已就绪!"
    }
    

5. 公司开业(onActivityCreated)

  • 做什么

    • 确认公司已开业(Activity 的 onCreate 已完成)。
    • 和其他部门协作(访问 Activity 的其他 Fragment 或数据)。
  • 注意
    AndroidX 之后此方法已废弃,建议在 onViewCreated 中处理。


6. 开工(onStart)

  • 做什么

    • 工位可见,准备接待客户(Fragment 对用户可见)。
    • 启动基础服务(如注册广播接收器)。

7. 正式工作(onResume)

  • 做什么

    • 进入工作状态(用户可交互,如点击按钮)。
    • 开启动态任务(如动画、传感器监听)。
  • 注意
    避免在这里执行耗时操作(如网络请求),否则会卡顿。


8. 摸鱼(onPause)

  • 做什么

    • 暂停手头工作(用户即将离开 Fragment)。
    • 保存临时数据(比如用户输入的表单)。
  • 场景

    • 新 Fragment 覆盖当前界面。
    • 用户按 Home 键回到桌面。

9. 下班(onStop)

  • 做什么

    • 工位不可见(Fragment 完全隐藏)。
    • 关闭耗电设备(释放资源、停止动画)。

10. 拆除工位(onDestroyView)

  • 做什么

    • 拆除工位布局(视图被销毁,但 Fragment 实例仍在)。
    • 清理工位垃圾(释放 UI 相关资源,如 Bitmap、监听器)。
  • 注意
    这是释放视图资源的关键节点,避免内存泄漏!


11. 离职准备(onDestroy)

  • 做什么

    • 销毁内部资源(如关闭数据库连接)。
    • Fragment 实例即将被销毁。

12. 正式离职(onDetach)

  • 做什么

    • 解除和公司的关系(与 Activity 断开连接)。
    • 不能再访问 Activity 的上下文。

为什么 Fragment 生命周期这么复杂?

  • 灵活性强
    Fragment 可以动态添加到 Activity,支持界面组合和复用。
  • 状态管理
    需要处理界面重建(如屏幕旋转)、导航栈(返回键)等场景。

常见场景的生命周期流转

场景 1:Fragment 第一次加载

复制

onAttach → onCreate → onCreateView → onViewCreated → onStart → onResume

场景 2:跳转到新 Fragment

当前 Fragment:onPause → onStop → onDestroyView  
新 Fragment:onAttach → onCreate → ... → onResume

场景 3:返回上一个 Fragment

当前 Fragment:onPause → onStop → onDestroyView → onDestroy → onDetach  
上一个 Fragment:onCreateView → onViewCreated → onStart → onResume

场景 4:屏幕旋转(配置变更)

onPause → onStop → onDestroyView → onDestroy → onDetach  
onAttach → onCreate → ... → onResume(重新创建)

避坑指南

  1. 不要在 onCreate 中操作 UI
    此时视图未加载,findViewById 会返回 null
  2. 在 onDestroyView 中释放资源
    避免视图销毁后仍持有 UI 引用(如 BitmapAdapter)。
  3. 谨慎使用 onActivityCreated
    AndroidX 后已废弃,逻辑应迁移到 onViewCreated
  4. 处理异步任务
    在 onPause 或 onDestroyView 中取消网络请求,防止内存泄漏。

总结

  • Fragment 生命周期 = 员工的职场旅程(入职、工作、离职)。

  • 关键节点

    • 布置工位onCreateView 和 onViewCreated
    • 释放资源onDestroyView 是重中之重。
  • 口诀

    • “onCreateView 搭布局,onViewCreated 搞初始化”
    • “onDestroyView 清垃圾,生命周期别忘记”