一句话总结:
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 或数据)。
- 确认公司已开业(Activity 的
-
注意:
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(重新创建)
避坑指南
- 不要在 onCreate 中操作 UI:
此时视图未加载,findViewById会返回null。 - 在 onDestroyView 中释放资源:
避免视图销毁后仍持有 UI 引用(如Bitmap、Adapter)。 - 谨慎使用 onActivityCreated:
AndroidX 后已废弃,逻辑应迁移到onViewCreated。 - 处理异步任务:
在onPause或onDestroyView中取消网络请求,防止内存泄漏。
总结
-
Fragment 生命周期 = 员工的职场旅程(入职、工作、离职)。
-
关键节点:
- 布置工位:
onCreateView和onViewCreated。 - 释放资源:
onDestroyView是重中之重。
- 布置工位:
-
口诀:
- “onCreateView 搭布局,onViewCreated 搞初始化”
- “onDestroyView 清垃圾,生命周期别忘记”