Android面试(11): fragment各种情况下的生命周期详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yz_cfm/article/details/85643141

我们这里主要从两个方面来分析: 1. fragment 生命周期详解  2. 代码实践 fragment 切换时生命周期方法回调

一、fragment 生命周期详解
我们先来看一下官方文档中的两幅图 ( 一个是 fragment 详细生命周期图,另一个是 Activity 生命周期和 fragment 生命周期的对比图 ):
                                                           

    之前的文章有分析 Activity 的生命周期,那时有说过 Activity 有四种生命周期状态: 运行状态、暂停状态、停止状态、销毁状态。同样,Fragment 在其生命周期内也可能会经历这几种状态,只不过有些细微的区别。
a. 运行状态:
    当一个 fragment 是可见的,并且它所关联的活动也正处于运行状态时,那么该 fragment 也处于运行状态。
b. 暂停状态
    当一个 Activity 进入暂停状态时( 弹出一个对话框或被另一个未占满屏幕的活动覆盖后 ),与它相关联的 fragment 也会进入到暂停状态
c. 停止状态
    当一个 Activity 进入停止状态时,与它相关联的 Fragment 就会进入到停止状态,或者通过调用 FragmentTransaction 的 remove()、replace() 方法将 fragment 从活动中移除,但如果在事务提交之前( 也就是 commit 之前 )调用 addToBackStack() 方法,这时的 fragment 也会进入到停止状态。总的来说,进入停止状态的 fragment 对用户来说是完全不可见的,有可能会被系统回收。
d. 销毁状态
    fragment 总是依附于活动而存在的,因此当活动被销毁时,与它相关联的 fragment 就会进入到销毁状态。或者通过调用 FragmentTransaction 的 remove() 、replace() 方法将 fragment 从活动中移除,但如果在事务提交之前没有调用 addToBackStack() 方法,这时的 fragment 也会进入到销毁状态。

结合之前 Activity 的生命周期方法,这里再介绍一下 fragment 中 Activity 没有的生命周期回调方法:
1. onAttach(Activity):
    当 fragment 和 Activity 建立关联的时候调用。
2. onCreateView(LayoutInflater, ViewGroup, Bundle):
    为 fragment 创建视图( 加载布局 )时调用。
3. onActivityCreated(Bundle):
    确保与 fragment 关联的活动一定已经创建完毕的时候调用,也就是当 Activity 中的 onCreate() 方法返回时调用。
4. onDestroyView():
    与 onCreateView() 相对应,在 fragment 的视图被移除时调用。
5. onDetach():
    与 onAttach() 方法相对应,当 fragment 与 Activity 解除关联的时候调用。
这里我们注意: 除了 onCreateView() ,其它的所有方法当你重写了,必须调用父类对于该方法的实现。


二、 代码实践
这里我们分两种情况 (动态加载 fragment 时,在提交事务之前调用 addToBackStack() 方法 和 不调用 addToBackStack() 方法) :
1. 在提交事务前不调用 addToBackStack() 方法,通过 FragmentTransaction 的 replace() 方法从一个 FragmentOne 跳转到 FragmentTwo 时的方法回调:
a. 当 FragmentOne 第一次被加载时:

b. 切换到 FragmentTwo 时:

c. 按下 back 键,由于此时没有调用 addToBackStack() 方法,所以在 FragmentOne 跳转到 FragmentTwo 后,FragmentOne 就被销毁了( 通过上面的回调方法可以看到 ),所以此时就会回到桌面。

2. 在提交事务前调用 addToBackStack() 方法,通过 FragmentTransaction 的 replace() 方法从一个 FragmentOne 跳转到 FragmentTwo 时的方回调:
a. 当 FragmentOne 第一次被加载时:

 和情况 1 相同

b. 切换到 FragmentTwo 时 ( FragmentOne 并没有被销毁,只是进入停止状态): 

c. 按下 back 键,由于此时调用 addToBackStack() 方法,所以在 FragmentOne 跳转到 FragmentTwo 后,FragmentOne没有被销毁( 通过上面的回调方法可以看到 ),所以此时 FragmentOne 重新返回前台

这里我们可以看到,FragmentOne 并没有调用 onAttach() -> onCreate() 方法,这是因为 FragmentOne 并没有被销毁。

文章参考: 郭婶 《第一行代码》,感谢郭婶带领入门!感谢!

源码下载:https://download.csdn.net/download/yz_cfm/10891630
 

猜你喜欢

转载自blog.csdn.net/yz_cfm/article/details/85643141
今日推荐