Fragment生命周期

场景演示 : 切换到该Fragment

11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume

屏幕灭掉:

11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop


屏幕解锁

11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume


切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView


切换回本身的Fragment:

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume

回到桌面

11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop

回到应用

11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume


退出应用

11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach


注:fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。

  • onAttached() —— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
  • onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
  • onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法
  • onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
  • onDetach() —— 当fragment和activity分离的时候,调用这个方法。

一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。


Android 中的 Fragment 是一种模块化 UI 组件,可以嵌入到 Activity 中并拥有自己的生命周期Fragment生命周期与宿主 Activity 紧密相关,但又具备独立的生命周期流程。以下是 Fragment 生命周期的详细解析: ### Fragment 生命周期阶段 Fragment生命周期由多个回调方法组成,这些方法在特定的生命周期事件发生时被调用。 1. **onAttach()** 当 Fragment 被附加到宿主 Activity 时调用。此时 Fragment 与 Activity 建立了联系,可以获取到 Activity 的引用。这是 Fragment 生命周期的第一个回调方法[^5]。 2. **onCreate()** 在 Fragment 初始化时调用。通常用于执行一些非 UI 相关的初始化操作,例如恢复状态或创建 ViewModel 实例。这个阶段与 Activity 的 onCreate() 类似,但不涉及视图创建。 3. **onCreateView()** 用于创建 Fragment 的视图层次结构。在此方法中通常会通过 `LayoutInflater` 加载布局资源并返回根视图。如果不需要 UI,则可以返回 `null`。此阶段是 Fragment UI 初始化的核心部分。 4. **onViewCreated()** 在 onCreateView() 返回的视图创建完成后调用。适合进行视图的绑定初始化操作,例如设置监听器或加载数据。 5. **onActivityCreated()** 表示宿主 Activity 已经完成其 onCreate() 方法。此时可以安全地访问 Activity 的 UI 元素数据。此方法在 Fragment 与 Activity 完全绑定后调用[^5]。 6. **onStart()** Fragment 变得可见时调用。此时 Fragment 已经附加到窗口,并准备显示给用户。 7. **onResume()** Fragment 进入活跃状态,用户可以与之交互。此阶段是 Fragment 生命周期中最活跃的部分。 8. **onPause()** 当 Fragment 失去焦点但仍部分可见时调用。通常用于保存数据或释放资源。 9. **onStop()** 当 Fragment 完全不可见时调用。此时 Fragment 仍保留其状态视图层次结构,但可能被系统回收以节省资源。 10. **onDestroyView()** 当 Fragment 的视图被销毁时调用。通常发生在 Fragment 被替换或移除时。此时可以释放与视图相关的资源。 11. **onDestroy()** Fragment 被销毁时调用。通常用于释放所有资源,例如取消异步任务或注销监听器。 12. **onDetach()** Fragment 与宿主 Activity 解除绑定时调用。这是 Fragment 生命周期的最后一个回调方法。 ### Fragment 与 Activity 生命周期的关系 Fragment生命周期与其宿主 Activity 紧密相关。当 Activity 的生命周期发生变化时,Fragment生命周期也会相应变化。例如: - 当 Activity 被创建时,Fragment 会依次执行 onAttach()、onCreate()、onCreateView() onActivityCreated()。 - 当 Activity 被销毁时,Fragment 会依次执行 onDestroy() onDetach()。 - 如果 Fragment 被隐藏或显示,可以通过 `onHiddenChanged(boolean hidden)` 方法进行处理[^2]。 ### Fragment 生命周期示例代码 以下是一个简单的 Fragment 示例,展示了如何实现部分生命周期方法: ```java public class ExampleFragment extends Fragment { @Override public void onAttach(@NonNull Context context) { super.onAttach(context); // Fragment 被附加到 Activity } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化非 UI 相关的数据 } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // 创建 Fragment 的 UI return inflater.inflate(R.layout.fragment_example, container, false); } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 初始化视图数据 } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // 宿主 Activity 已经创建完成 } @Override public void onDestroyView() { super.onDestroyView(); // 释放与视图相关的资源 } @Override public void onDestroy() { super.onDestroy(); // 释放所有资源 } @Override public void onDetach() { super.onDetach(); // Fragment 与 Activity 解除绑定 } } ``` ### 生命周期图示 Fragment生命周期可以通过一张图来更直观地理解。生命周期图展示了 Fragment 从创建到销毁的整个过程,以及各个生命周期方法之间的关系。Fragment生命周期图可以在 [GitHub](https://github.com/xxv/android-lifecycle) 上找到[^2]。 ### 生命周期管理 在实际开发中,Fragment生命周期管理需要注意以下几点: - **避免内存泄漏**:在 Fragment 中持有 Activity 或 Context 的引用时,需要确保在生命周期结束时释放这些引用。 - **合理使用返回栈**:将 Fragment 添加到返回栈中可以实现用户点击返回键时回退到上一个 Fragment 的效果。未添加到返回栈的 Fragment 在替换时会被直接销毁。 - **动态管理 Fragment**:通过 `FragmentManager` `FragmentTransaction` 可以动态地添加、替换或移除 Fragment。 ### 总结 Fragment生命周期是 Android 开发中的核心概念之一。通过理解 Fragment生命周期及其与 Activity 的关系,开发者可以更好地管理 UI 组件资源,从而构建出更高效、更稳定的 Android 应用。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值