【Android】Fragment生命周期详解
三三要成为安卓糕手
之前已经学习了Activity的生命周期,今天来学习Fragment的生命周期,先附上官方提供的生命周期图,和自己总结的表格
生命周期方法 | 对应阶段(结合图片) | 功能注释 | ||
---|---|---|---|---|
onAttach | - | 当 Fragment 与 Activity 关联时会被调用,此时可获取 Activity 的引用。 | 附着,连接 | |
onCreate | CREATED 阶段 | 当 Fragment 被创建时调用,用于初始化不依赖于视图的组件,不初始化 UI 元素。 | 创建Fragment | |
onCreateView | 用于创建 Fragment 的视图。 | 创建Fragment视图 | ||
onViewCreated | 当视图创建完成后调用,可在此初始化 UI 组件或绑定数据,此时视图已完全创建,可访问 UI 元素。 | 创建Fragment视图中的UI控件 | ||
onViewStateRestored | 在onCreateView() 之后、onStart() 之前调用,用于恢复先前保存的 Fragment 状态,与onSaveInstanceState 配对使用。 | |||
onActivityCreated | - | 当宿主 Activity 的 onCreate() 方法返回后调用,可在此与 Activity 交互或依赖于 Activity 的内容,从 API 28 开始已废弃,建议使用 onViewCreated 。 | ||
onStart | STARTED 阶段 | 当 Fragment 变为可见时调用,此时视图即将显示在屏幕上。 | ||
onResume | RESUMED 阶段 | 当 Fragment 可与用户交互时调用,Fragment 处于活动状态,适合在此恢复暂停的操作或更新 UI。 | ||
onPause | STARTED 阶段 | 当 Fragment 失去用户焦点但仍然可见时调用,可在此保存用户数据或暂停耗时操作。 | ||
onStop | CREATED 阶段 | 当 Fragment 完全不可见时调用,适合在此保存状态或释放不再需要的资源。 | ||
onSaveInstanceState | CREATED 阶段 | 在 Fragment 即将被销毁(如用户旋转屏幕或 Fragment 被放入后台)之前调用,作用是保存 Fragment 的瞬时状态到 Bundle 中,以便在恢复时使用。 | ||
onDestroyView | DESTROYED 阶段 | 当与 Fragment 视图关联的资源被释放时调用,此时视图即将销毁,适合在此清理 UI 相关的资源。 | ||
onDestroy | 当 Fragment 不再需要时调用,通常用于清理全局资源,onDestroy 触发时,Fragment 的视图生命周期结束。 | |||
onDetach | - | 当 Fragment 与 Activity 解除关联时调用,Fragment 的生命周期结束。 |
一:总体代码
Activity代码参考上一章,这是UI界面
public class MyFragment extends Fragment {private static final String TAG = "MyFragment";@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.layout_red, container, false);TextView tvText = view.findViewById(R.id.tv_text);tvText.setText("我是MyFragment里面的标签");tvText.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(getActivity(),"弹个窗",Toast.LENGTH_SHORT).show();}});Log.i(TAG, TAG +" onCreateView: 在这里关联视图");return view;}@Overridepublic void onAttach(@NonNull Context context) {super.onAttach(context);//当Fragment与Activity关联时会被调用。此时可以获取Activity的引用//此时就可以直接获取getActivityFragmentActivity activity = (FragmentActivity) getActivity();Log.i(TAG, TAG + " onAttach: Fragment与Activity关联");}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//当Fragment被创建时调用,用于初始化不依赖于视图的组件,例如获取资源或设置数据。// 所以不要在这里初始化UI元素。Log.i(TAG, TAG + " onCreate: Fragment被创建");}@Overridepublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);//当视图创建完成后调用,可在此初始化UI组件或绑定数据。此时视图已经完全创建,可以访问UI元素。Log.i(TAG, TAG + " onViewCreated: 视图已经完全创建,可以访问UI元素");}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);//当宿主Activity的onCreate()方法返回后调用,可在此与Activity交互或依赖于Activity的内容。//从API 28开始已废弃,建议使用onViewCreated()就可以了。Log.i(TAG, TAG + " onActivityCreated: 一个已废弃的方法");}@Overridepublic void onStart() {super.onStart();//当Fragment变为可见时调用,此时视图即将显示在屏幕上Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");}@Overridepublic void onResume() {super.onResume();//当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");}@Overridepublic void onPause() {super.onPause();//当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");}@Overridepublic void onStop() {super.onStop();//当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");}@Overridepublic void onViewStateRestored(@Nullable Bundle savedInstanceState) {super.onViewStateRestored(savedInstanceState);// 在onCreateView()之后、onStart()之前调用。// 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");}@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);//在Fragment即将被销毁(例如,用户旋转屏幕或Fragment被放入后台)之前调用(通常在onPause()或onStop()之前调用)。// 它的作用是保存Fragment的瞬时状态(如UI状态或一些临时数据)到Bundle中,以便在恢复时使用。Log.i(TAG, TAG + " onSaveInstanceState: 在这里可以保存数据");}@Overridepublic void onDestroyView() {super.onDestroyView();//当与Fragment视图关联的资源被释放时调用。此时视图即将销毁,适合在此清理UI相关的资源。Log.i(TAG, TAG + " onDestroyView: 视图即将销毁");}@Overridepublic void onDestroy() {super.onDestroy();//当Fragment不再需要时调用,通常用于清理全局资源。适合在此释放持久数据,比如成员变量、某些图片资源或对象资源等等。//onDestroy触发时,Fragment 的视图生命周期结束Log.i(TAG, TAG + " onDestroy: 已销毁,Fragment的视图生命周期结束");}@Overridepublic void onDetach() {super.onDetach();//当Fragment与Activity解除关联时调用。Fragment的生命周期结束Log.i(TAG, TAG + " onDetach: Fragment与Activity解除关联时调用");}
}
二:添加Fragment生命周期变化
点击添加按钮,看看生命周期变化
1:view操作在哪个生命周期中进行
官方是推荐在onViewCreated(视图创建完毕,初始化UI控件)中进行一些view操作的,比如说
但是在商业场景开发当中,多数情况是在onCreateView创建Fragment视图中,就可以进行一些view操作
提问:为什么此时视图还没有被完全的创建出来,我们就可以去查找到控件呢?
虽然当前我们的view视图还没有返回到我们的Fragment底层,但是我们的view已经创建出来了,并不是一个空的对象,只不过还没有附加到当前的屏幕上而已
2:废弃的onActivityCreated
方法
其实onActivityCreated就是一个**回调通知方法**,宿主的onCreate()
完成后,告诉Fragment,Fragment就可以在这个方法中与宿主进行交互或者访问宿主的相关内容信息
从 Android API 28 开始,onActivityCreated
已被废弃,官方建议使用onViewCreated
替代,它更专注于 Fragment 视图相关的初始化、交互逻辑等操作
3:视图状态恢复onViewStateRestored
回顾一下:
我们在Activity的生命周期中恢复状态用的是onRestoreInstanceState方法
在Fragment中使用的是onViewStateRestored
@Overridepublic void onViewStateRestored(@Nullable Bundle savedInstanceState) {super.onViewStateRestored(savedInstanceState);// 在onCreateView()之后、onStart()之前调用。// 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");}
方法执行顺序在onViewCreated之后、 onStart之前 ;它会去判断当前Bundle中有没有数据,没有数据说明是第一次创建
4:显示视图和重新开始(可交互)
@Overridepublic void onStart() {super.onStart();//当Fragment变为可见时调用,此时视图即将显示在屏幕上Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");}@Overridepublic void onResume() {super.onResume();//当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");}
三:上划切换到桌面再返回场景
1:上划到桌面场景
@Overridepublic void onPause() {super.onPause();//当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");}@Overridepublic void onStop() {super.onStop();//当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");}
@Overridepublic void onSaveInstanceState(@NonNull Bundle outState) {super.onSaveInstanceState(outState);//在Fragment即将被销毁(例如,用户旋转屏幕或Fragment被放入后台)之前调用(通常在onPause()或onStop()之前调用)。// 它的作用是保存Fragment的瞬时状态(如UI状态或一些临时数据)到Bundle中,以便在恢复时使用。Log.i(TAG, TAG + " onSaveInstanceState: 在这里可以保存数据");}
上划操作
可以往outState中存储一些数据
2:从后台点击回来场景
再从后台点回来
四:移除Fragment场景
销毁相关的有三个方法
点击移除按钮
比Activity多了一个生命周期,多一个Detach
onDetach,跟Activity的destory不同,Fragment的destory是当前视图生命周期结束了,也就是UI结束了