您的位置:

Fragment生命周期详解

一、Fragment生命周期方法概述


public class ExampleFragment extends Fragment {

    public ExampleFragment() {
        // Required empty public constructor
    }

    // Fragment创建
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
    }

    // Fragment创建视图
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // ...
        return rootView;
    }

    // Fragment添加到Activity
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        // ...
    }

    // Fragment即将显示
    @Override
    public void onStart() {
        super.onStart();
        // ...
    }

    // Fragment可交互
    @Override
    public void onResume() {
        super.onResume();
        // ...
    }

    // Fragment不可交互
    @Override
    public void onPause() {
        super.onPause();
        // ...
    }

    // Fragment不可见
    @Override
    public void onStop() {
        super.onStop();
        // ...
    }

    // Fragment解除与Activity的关联
    @Override
    public void onDetach() {
        super.onDetach();
        // ...
    }

    // Fragment销毁视图
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        // ...
    }

    // Fragment销毁
    @Override
    public void onDestroy() {
        super.onDestroy();
        // ...
    }
}

Fragment是Android开发中常见的一个关键组件,因此学习Fragment的生命周期也就成为了必须掌握的内容之一。在这里,我们将围绕着生命周期方法,在接下来的段落中对Fragment的生命周期进行详细的讲解。

二、Fragment生命周期方法是用来加载

在Fragment的生命周期中,其中被广泛运用的就是onCreateView()方法,这个方法用来加载Fragment的视图,还可以在这个过程中完成一些初始化的工作。

这个方法通常在Fragment创建时调用,具体调用时机为:

1、如果Fragment离线并且它具有UI,则在它被更新为在线并从其视图层次结构中删除时调用onCreateView()。

2、如果Fragment在线并且它具有UI,则在将其视图从其视图层次结构中删除时调用onCreateView()。

三、Fragment生命周期变化

Fragment的生命周期是会发生变化的。当它被创建时,将会经历onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()和onResume()等生命周期方法。当Fragment被销毁时,将会经历onPause()、onStop()、onDestroyView()、onDestroy()和onDetach()等生命周期方法。

在这些生命周期方法的调用过程中,Fragment的状态也随之发生变化,如下表所示:

四、Fragment生命周期有哪些

在Android开发者中,常见的对Fragment的生命周期方法的描述通常是这样的:


onCreateView() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()

虽然这个描述可以大致了解Fragment的生命周期,但是其实还有很多细节和变化。常用的生命周期方法及其作用如下所示:

五、Fragment生命周期4种状态

Fragment的生命周期状态一共分为4种,即:

1、Active:Fragment当前处于活跃状态,也就是当前用户正在与Fragment进行交互。

2、Paused:Fragment处于失去焦点的状态。

3、Stopped:Fragment不可见,但是仍然和Activity相关联。

4、Destroyed:Fragment已被销毁,其上下文已被完全销毁,并且它与Activity的链接已断开。

六、Fragment生命周期表

下面是对Fragment生命周期的详细描述:

生命周期方法 调用时机 作用
onAttach() 当Fragment被添加到Activity时 Fragment与Activity相关联
onCreate() 当Fragment被创建时 完成初始化工作
onCreateView() 当Fragment首次创建View时 加载并返回Fragment的布局
onActivityCreated() 当Fragment所依附的Activity完成onCreate()时 完成Fragment添加到Activity后的操作,如恢复ABD, 延迟动画等
onStart() 当Fragment开始可见时 Fragment是可见且已经附加到Activity
onResume() 当Fragment可交互时 Fragment处于栈顶,用户可以与之交互
onPause() 当Fragment失去焦点时 Fragment不可见,但是仍然存活
onStop() 当Fragment不可见时 Fragment未销毁,但是不可见,可能已被回收
onDestroyView() 当Fragment的视图被销毁时 解除View的引用,避免内存泄漏
onDestroy() 当Fragment被销毁时 释放资源
onDetach() 当Fragment与Activity解除关联时 释放所有与Activity相关联的资源

七、Fragment生命周期图

为了更加方便地理解Fragment的生命周期,下面是一张生命周期的图表。

八、Fragment生命周期方法详解

1、onCreate()

在Fragment创建时回调。这个生命周期方法可以完成一些初始化,如创建数据集或者一些文件。

2、onAttach()

当Fragment被附加到Activity时回调。在这个生命周期方法中,我们可以获取与当前Fragment相关联的Activity,通过调用getActivity()方法来实现。


@Override
public void onAttach(Context context) {
    super.onAttach(context);
    //获取到当前 Fragment 所属 activity 的引用
    mActivity = (MainActivity) context;
}

3、onCreateView()

在Fragment首次创建视图时调用。这个方法通常用于初始化Fragment的布局,并返回这个布局的根View。此外,在onCreateView()方法中还可以设置Fragment的显示风格、添加事件监听和初始化一些控件等。


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // 最好加上root 参数,否则报错
    View root = inflater.inflate(R.layout.fragment_layout, container, false);

    // 初始化布局
    initView(root);

    return root;
}

private void initView(View root) {

}

4、onActivityCreated()

在Activity创建之后,Fragment将触发onActivityCreated()方法。在这个生命周期方法中,Fragment已经关联到Activity,并且Activity的视图层次结构已经完全初始化,所以这里可以扩展Activity的UI等。


@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // ...
}

5、onStart()

在用户可以看见Fragment时回调。这个生命周期方法表示Fragment可见,已经添加到Activity中,但是可能不在前台。在onStart()方法中我们可以处理Fragment相关的可见性,比如是否显示广告、是否展示一些提示、是否刷新数据等。


@Override
public void onStart() {
    super.onStart();
    // ...
}

6、onResume()

这个生命周期方法表示Fragment正在前台,可以与用户进行交互。在onResume()方法中,我们可以开启或恢复一些服务或线程,从而维护Fragment的UI显示。


@Override
public void onResume() {
    super.onResume();
    // ...
}

7、onPause()

Fragment正在前台并与用户进行交互时,如果发生了一些影响到了页面可见性的事情,比如打开了另一个Activity、弹出了Dialog等,那么onPause()方法将会被调用。在这里,我们可以暂停一些资源的使用,比如MediaPlayer、网络操作等。


@Override
public void onPause() {
    super.onPause();
    // ...
}

8、onStop()

当Fragment不再可见时回调,比如被另一个Fragment覆盖或者当Activity进入后台时。onStop()方法可以用来停止或释放资源,比如停止动画、取消网络访问等。


@Override
public void onStop() {
    super.onStop();
    // ...
}

9、onDestroyView()

当Fragment视图被销毁时回调。在onDestroyView()方法中,我们可以销毁那些与UI相关的资源,如View和Dialog等。但是,Fragment所关联的Activity仍然存在,所以Fragment不能被销毁。


@Override
public void onDestroyView() {
    super.onDestroyView();
    // ...
}

10、onDestroy()

当Fragment将要被销毁时回调。在这个生命周期方法中,我们可以销毁一些资源,比如停止动画、取消网络访问等。此外,如果在onCreateView()方法中创建了非View相关的资源,那么onDestroy()方法中也要进行释放。


@Override
public void onDestroy() {
    super.onDestroy();
    // ...
}

11、onDetach()

当Fragment与Activity解除关联时回调。在这个生命周期方法中,我们可以进行资源释放或者清除操作。例如在onAttach()方法中获取到的Activity的应用需要在onDetach()方法中清除掉。


@Override
public void onDetach() {
    super.onDetach();
    // ...
}

九、Fragment生命周期方法包括

Fragment的生命周期包括Fragment的创建周期、Fragment的可见性和状态周期、Fragment的交互周期及Fragment的系统相关周期。

十、总结

经过这么详