欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment生命周期

程序员文章站 2022-06-08 11:06:33
...

    和 Activity 一样, Fragment 也有其相应的生命周期, 但是和 Activity 生命周期有着什么样的联系, 又会在 Activity 生命周期的生命阶段分别会回调到 Fragment 生命周期的哪些方法呢?  让我们开始探索:

    首先, Fragment 的生命周期总共有 11 个, 比 Activity 的 6个 (不包括 onRestart) 多了 5 个, 我们看一张图:

                                                                    Fragment生命周期

    在此, 我们根据这张图, 着重分析这多出的 5 个生命周期.


onAttach:

  • 官方描述中说到, 该方法会在 Fragment 第一次和它的 Context 建立关联的时候得到回调, 这个 context 便是 宿主 Activity, 该方法的参数便是宿主 Activity, 我们可以在这里拿到 Activity 实例对象, 然后可以和 Activity 进行通信, 最常见的便是在这里进行接口变量的初始化操作, 以便后续通过接口通信.

onCreate:

  • 该方法和 Activity 的回调很类似, 可以在这里做一些初始化操作, 如获取 Activity 通过 bundle 传递过来的数据.
  • 注意: 官方明确说明到, 当该方法回调时, Activity 可能还处于创建的过程中, 你不能在该方法内去操纵 Activity 的 UI 层级组件, 如果你需要的话, 你应该在 onActivityCreate 方法内去干那些事情.

onCreateView:

  • 该方法用来初始化 Fragment 用户视图界面, 官方描述中说到, 这是可选的, 我们可以在这里返回一个 null, 代表着这个 Fragment 没有视图界面.      可能有同学会疑问, 既然没有视图界面, 那我们还要这个 Fragment 干嘛, 在这里我简单提以下, 我们可以用一个没有视图的 Fragment 来监控 Activity 的生命周期, 从而可以封装一些很优美的操作, 比如 Glide 的生命周期监控中就采用了这种思想.
  • 如果我们在这里返回了一个非空的视图, 那么他之后将会在 OnDestoryView 回调中得到销毁.

onActivityCreate:

  • 该方法会在宿主 Activity 被完全创建的时候得到回调, 我们可以在这里去操纵 Activity 的 UI 控件.
  • 官方描述中说到, 这是一个很好的地方去调用  setRetainInstance(boolean)  方法来保存 Fragment 实例对象当 Activity 被重建的时候 (如屏幕旋转).

    接下来的 onStart, onResume, onPause, onStop  这几个生命周期方法和 Activity 生命周期方法类似, 在此不一 一描述, 不过需要注意的是, 前两个会在在宿主的 Activity 相应方法之后得到回调,  后两个会在 Activity 的相应方法之前得到回调, 这也是合情合理的, 毕竟 Fragment 是嵌套在 Activity 中的.


onDestoryView:

  • 这个方法会在销毁之前由 onCreateView 方法创建的 view 的时候得到回调, 在 Fragment 需要显示视图时, 一个新的 View 将会被创建.
  • 注意: 官方明确说明, 该方法的回调和 onCreateView 没有太多的关联, 也就是说即使你在 onCreateView 方法中返回了 null, 该方法也会得到回调.

onDestory:

  • 和 Activity 的 onDestory 类似, 销毁一个 fragment, 代表着这个 fragment 不会再使用.

onDetach:

  • 表示该 fragment 和不在和宿主 Activity 有关联, 这是 fragment 生命周期的最后一个回调方法, 这个回调方法执行完之后,
  • 注意: 如果我们通过  setRetainInstance(boolean)  方法来保存 Fragment 实例对象当 Activity 被重现创建的时候, 该方法会在 onDestoryView 之后得到回调.

补充:

    我们需要注意 setRetainInstance(boolean) 方法, 如果我们通过该方法设置了当 Activity 被重建时, 保存 fragment  实例对象, 那么 fragment 生命周期会有轻微的变化.

    如下是没有设置时的生命周期变化:

D/FragmentFirst--->onAttach======: Fragment  地址:{e83e7a3 #1 id=0x7f080093}
D/FragmentFirst--->onCreate======: Fragment
D/FragmentFirst--->onCreateView======: Fragment
D/FragmentLifeCycleActivity--->onCreate======: Activity
D/FragmentFirst--->onActivityCreated======: Fragment
D/FragmentLifeCycleActivity--->onStart======: Activity
D/FragmentFirst--->onStart======: Fragment
D/FragmentLifeCycleActivity--->onResume======: Activity
D/FragmentFirst--->onResume======: Fragment

------ 开始旋转屏幕 ------

D/FragmentFirst--->onPause======: Fragment
D/FragmentLifeCycleActivity--->onPause======: Activity
D/FragmentFirst--->onStop======: Fragment
D/FragmentLifeCycleActivity--->onStop======: Activity
D/FragmentFirst--->onDestroyView======: Fragment
D/FragmentFirst--->onDestroy======: Fragment
D/FragmentFirst--->onDetach======: Fragment
D/FragmentLifeCycleActivity--->onDestroy======: Activity


D/FragmentFirst--->onAttach======: Fragment  地址:{273ce0b #1 id=0x7f080093}
D/FragmentFirst--->onCreate======: Fragment
D/FragmentFirst--->onCreateView======: Fragment
D/FragmentLifeCycleActivity--->onCreate======: Activity
D/FragmentFirst--->onActivityCreated======: Fragment
D/FragmentLifeCycleActivity--->onStart======: Activity
D/FragmentFirst--->onStart======: Fragment
D/FragmentLifeCycleActivity--->onResume======: Activity
D/FragmentFirst--->onResume======: Fragment

    我们可以通过打印的地址可以明显的看到, fragment 首先被销毁了 ,然后重现创建了一次实例对象, 并和 activity 相关联.


    我们再看看设置了保存实例之后的生命周期:

D/FragmentFirst--->onAttach======: Fragment  地址: {e83e7a3 #1 id=0x7f080093} 
D/FragmentFirst--->onCreate======: Fragment
D/FragmentFirst--->onCreateView======: Fragment
D/FragmentLifeCycleActivity--->onCreate======: Activity
D/FragmentFirst--->onActivityCreated======: Fragment
D/FragmentLifeCycleActivity--->onStart======: Activity
D/FragmentFirst--->onStart======: Fragment
D/FragmentLifeCycleActivity--->onResume======: Activity
D/FragmentFirst--->onResume======: Fragment

------ 开始旋转屏幕 ------

D/FragmentFirst--->onPause======: Fragment
D/FragmentLifeCycleActivity--->onPause======: Activity
D/FragmentFirst--->onStop======: Fragment
D/FragmentLifeCycleActivity--->onStop======: Activity
D/FragmentFirst--->onDestroyView======: Fragment
D/FragmentFirst--->onDetach======: Fragment
D/FragmentLifeCycleActivity--->onDestroy======: Activity


D/FragmentFirst--->onAttach======: Fragment  地址: {e83e7a3 #1 id=0x7f080093} 
D/FragmentFirst--->onCreateView======: Fragment
D/FragmentLifeCycleActivity--->onCreate======: Activity
D/FragmentFirst--->onActivityCreated======: Fragment
D/FragmentLifeCycleActivity--->onStart======: Activity
D/FragmentFirst--->onStart======: Fragment
D/FragmentLifeCycleActivity--->onResume======: Activity
D/FragmentFirst--->onResume======: Fragment

    我们可以看到, fragment 的 onDestory 和 onCreate 方法没有回调, 的确如官方说描述的那样, onDetach 方法会在 onDestoryView 之后得到回调, 由此我们可以知道, 当设置了 setRetainInstance(boolean) 之后, fragment 并不会得到重新创建, 只是其视图销毁重建, 然后重新和重建后的 Activity 关联.


参考博文:

    https://blog.csdn.net/gjy_it/article/details/52150773