首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Android】Fragment生命周期详解

【Android】Fragment生命周期详解

作者头像
三三是该溜子
发布2025-08-26 08:17:25
发布2025-08-26 08:17:25
14700
代码可运行
举报
文章被收录于专栏:该溜子的专栏该溜子的专栏
运行总次数:0
代码可运行

三三要成为安卓糕手

之前已经学习了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界面

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
代码语言:javascript
代码运行次数:0
运行
复制
public class MyFragment extends Fragment {
    private static final String TAG = "MyFragment";
    @Nullable
    @Override
    public 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() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"弹个窗",Toast.LENGTH_SHORT).show();
            }
        });
        Log.i(TAG, TAG +" onCreateView: 在这里关联视图");
        return view;

    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        //当Fragment与Activity关联时会被调用。此时可以获取Activity的引用
        //此时就可以直接获取getActivity
        FragmentActivity activity = (FragmentActivity) getActivity();
        Log.i(TAG, TAG + " onAttach: Fragment与Activity关联");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //当Fragment被创建时调用,用于初始化不依赖于视图的组件,例如获取资源或设置数据。
        // 所以不要在这里初始化UI元素。

        Log.i(TAG, TAG + " onCreate: Fragment被创建");
    }



    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        //当视图创建完成后调用,可在此初始化UI组件或绑定数据。此时视图已经完全创建,可以访问UI元素。
        Log.i(TAG, TAG + " onViewCreated: 视图已经完全创建,可以访问UI元素");
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //当宿主Activity的onCreate()方法返回后调用,可在此与Activity交互或依赖于Activity的内容。
        //从API 28开始已废弃,建议使用onViewCreated()就可以了。
        Log.i(TAG, TAG + " onActivityCreated: 一个已废弃的方法");
    }


    @Override
    public void onStart() {
        super.onStart();
        //当Fragment变为可见时调用,此时视图即将显示在屏幕上
        Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");
    }

    @Override
    public void onResume() {
        super.onResume();
        //当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。
        Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");
    }

    @Override
    public void onPause() {
        super.onPause();
        //当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。
        Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");
    }

    @Override
    public void onStop() {
        super.onStop();
        //当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。
        Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");
    }

    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        // 在onCreateView()之后、onStart()之前调用。
        // 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。
        Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");
    }

    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        //在Fragment即将被销毁(例如,用户旋转屏幕或Fragment被放入后台)之前调用(通常在onPause()或onStop()之前调用)。
        // 它的作用是保存Fragment的瞬时状态(如UI状态或一些临时数据)到Bundle中,以便在恢复时使用。
        Log.i(TAG, TAG + " onSaveInstanceState: 在这里可以保存数据");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        //当与Fragment视图关联的资源被释放时调用。此时视图即将销毁,适合在此清理UI相关的资源。
        Log.i(TAG, TAG + " onDestroyView: 视图即将销毁");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //当Fragment不再需要时调用,通常用于清理全局资源。适合在此释放持久数据,比如成员变量、某些图片资源或对象资源等等。
        //onDestroy触发时,Fragment 的视图生命周期结束
        Log.i(TAG, TAG + " onDestroy: 已销毁,Fragment的视图生命周期结束");
    }

    @Override
    public 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

代码语言:javascript
代码运行次数:0
运行
复制
@Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        // 在onCreateView()之后、onStart()之前调用。
        // 它用于恢复先前保存的Fragment状态,与onSaveInstanceState()配对使用。
        Log.i(TAG, TAG + " onViewStateRestored: 恢复先前保存的Fragment状态");
    }

方法执行顺序在onViewCreated之后、 onStart之前 ;它会去判断当前Bundle中有没有数据,没有数据说明是第一次创建

4:显示视图和重新开始(可交互)

代码语言:javascript
代码运行次数:0
运行
复制
    @Override
    public void onStart() {
        super.onStart();
        //当Fragment变为可见时调用,此时视图即将显示在屏幕上
        Log.i(TAG, TAG + " onStart: 此时视图即将显示在屏幕上");
    }

    @Override
    public void onResume() {
        super.onResume();
        //当Fragment可与用户交互时调用,Fragment处于活动状态。适合在此恢复暂停的操作或更新UI。
        Log.i(TAG, TAG + " onResume: Fragment可与用户交互时调用");
    }

三:上划切换到桌面再返回场景

1:上划到桌面场景

代码语言:javascript
代码运行次数:0
运行
复制
    @Override
    public void onPause() {
        super.onPause();
        //当Fragment失去用户焦点但仍然可见时调用,可以在此保存用户数据或暂停耗时操作。
        Log.i(TAG, TAG + " onPause: Fragment失去用户焦点但仍然可见");
    }

    @Override
    public void onStop() {
        super.onStop();
        //当Fragment完全不可见时调用。适合在此保存状态或释放不再需要的资源。
        Log.i(TAG, TAG + " onStop: Fragment完全不可见时调用");
    }
代码语言:javascript
代码运行次数:0
运行
复制
@Override
    public 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结束了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:总体代码
  • 二:添加Fragment生命周期变化
    • 1:view操作在哪个生命周期中进行
    • 2:废弃的onActivityCreated方法
    • 3:视图状态恢复onViewStateRestored
    • 4:显示视图和重新开始(可交互)
  • 三:上划切换到桌面再返回场景
    • 1:上划到桌面场景
    • 2:从后台点击回来场景
  • 四:移除Fragment场景
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档