Fragment的生命周期
Fragment的生命周期
在介绍了Activity的生命周期之后,本篇将分析Fragment的生命周期。Fragment拥有自己的生命周期,可以接收、处理用户的事件。但是Fragment不能独立存在,必须依存于Activity,而且Fragment 的生命周期直接受activity的影响。
Fragment的生命周期在流程上和Activity是非常相似的,只是比Activity多了几个生命周期。下图,是两者生命周期的对照图。
流程:
onAttach(Activity activity)
fragment和activity建立联系,只调用一次
onCreate(Bundle savedInstanceState)
系统创建fragment的时候调用,可以用于读取保存的状态值,获取或者初始化一些数据,但是不能执行耗时的任务,否则会影响页面的显示
onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
创建 Fra gment 中显示的 view, 其中 inflater 用来装载布局文件, container 表示 标签的父标签对应的 ViewGroup 对象, savedInstanceState 可以获取 Fragment 保存的状态
onViewCreated(View view, Bundle savedInstanceState)
表示窗口已经初始化完毕,此时可以调用控件了
onStart()
和activity一致 启动, Fragement 启动时回调, 此时Fragement可见;
onResume()
和activity一致 在activity中运行是可见的, Fragement 进入前台, 可与用户交互;
onPause()
和activity一致 其他的activity获得焦点,仍然可见
onStop()
和activity一致,fragment不可见的,将从屏幕上消失
onDestroyView()
Fragment中的布局被移除时调用。表示fragemnt销毁相关联的UI布局
清除所有跟视图相关的资源
onDestroy()
销毁fragment对象,跟activity类似。
onDetach()
Fragment和Activity解除关联 脱离Activity的时候调用,是Fragment 生命周期的最后一个方法,执行完后将不再与 Activity 关联,将释放所有 fragment 对象和资源
实例
构建两个简单Fragment,FragmentA和FragmentB,并打印Fragment的每个生命周期。
情况一:采用Replace方法切换Fragment
启动FragmentA
A切换B
可以看到,FragmentA调用顺序为onPause, onStop, onDestroyView, onDestroy, onDetach。也就是说,FragmentA已经被销毁。A切换到B,就是结束A,创建B的过程。
B切换A
流程和A切换B是一致
锁屏
此时,只有FragmentA是存活的,FragmentB已经被销毁
销毁FragmentA
情况二:采用show/hide方法切换Fragment
启动A
和”情况一”一致
A切换B(第一次)
可以看到,FragmentA的生命周期方法并没有被调用,这也就说明从FragmentA切换FragmentB时,FragmentA的生命周期并没有发生变化。而FragmentB的生命周期与启动Fragment的生命周期是一样的,所以,此时A切换B,A的生命周期没有发生变化,B被启动。
在A,B都被启动后,在两者之间切换,两者的生命周期都不会再改变。
当调用hide隐藏Fragment时,Fragment的生命周期不会发生变化,这时如果你想做一些操作,要怎么处理呢?答案就是:onHiddenChanged方法。当hide一个fragment时,该方法会调用传入参数为true表示该fragment被隐藏了,当fragment调用了show方法后,该方法传入的参数为false。
锁屏
可以看得出来,两个Fragment都调用了onPause, onStop。也就是两个Fragment都处于运行状态。
销毁FragmentA
情况三:Fragment以静态的方式加载
这是使用Fragment最简单的一种方式,把Fragment当成普通的控件,直接写在Activity的布局文件中。主要步骤:
1、继承Fragment,重写onCreateView决定Fragemnt的布局
2、在Activity中声明此Fragment,就当和普通的View一样
例如:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/fg_content"
android:layout_width="match_parent"
android:layout_height="match_parent" android:name="com.example.lifecycle.fragmentlifecycle.TestFragmentA"
/>
</FrameLayout>
静态加载的Fragment的启动,结束,锁屏的生命周期和情况一基本是一致的。