Fragment生命周期
# 1. Fragment的状态
Fragment必须嵌入到Activity中使用,Fragment生命周期直接受到所在Activity的影响。
- 当Activity暂停,它拥有的Fragment都暂停
- Activity被销毁,它拥有的Fragment都销毁
# 运行状态
当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态。
# 暂停状态
当一个Activity进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见碎片就会进入到暂停状态,Fragment所关联的Activity处于暂停,则该Fragment也处于暂停
# 停止状态
当一个Activity进入停止状态时,与它相关联的碎片就会进入到停止状态;或者通过调用FragmentTransaction的remove()
、replace()
方法将碎片从活动中移除,但如果在事务提交之前调用addToBackStack()
方法,这时的碎片也会进入到停止状态。
总的来说,进入停止状态的碎片对用户来说是完全不可见的,有可能会被系统回收。
# 销毁状态
Fragment总是依附于Activity而存在的,因此当活动被销毁时,与它相关联的碎片就会进入到销毁状态。或者通过调用FragmentTransaction的remove()
、replace()
方法将碎片从活动中移除,但在事务提交之前并没有调用addToBackStack()
方法,这时的碎片也会进入到销毁状态(调用进入停止状态)。
# 2. Fragment的回调
onAttach() 当Fragment与Activity发生关联时调用
onCreateView() 创建该Fragment的视图(加载布局)时调用
onViewCreated()
onActivityCreated() 确保与碎片相关联的活动一定已经创建完毕的时候调用,当Activity的onCreate方法返回时调用
onStart()
onResume()
onPause()
onStop()
onDestroyView() 与onCreateView相对应,当该Fragment的视图被移除时调用
onDestroy()
onDetach() 与onAttach相对应,当Fragment与Activity关联被取消时调用
(1)、Fragment在Activity中replace
新替换的Fragment:onAttach-->onCreate-->onCreateView-->onViewCreated-->onActivityCreated-->onStart-->onResume
被替换的Fragment:onPause-->onStop-->onDestroyView-->onDestroy-->onDestach
(2)、Fragment在Activity中replace并addToBackStack
新替换的Fragment(没有在BackStack中):onAttach-->onCreate-->onCreateView-->onViewCreated-->onActivityCreated-->onStart-->onResume
新替换的Fragment(在BackStack中):onCreateView-->onViewCreated-->onActivityCreated-->onStart-->onResume
被替换的Fragment:onPause-->onStop-->onDestroyView
(3)、Fragment在上述情况下进入onResume后,则进入了运行状态,以下四个生命周期将跟随所属的Activity一起调用:
onPause > onStop > onStart > onResume
13、Fragment状态保存startActivityForResult是哪个类的方法,在什么情况下使用?
Fragment调用startActivityForResult--->HostCallbacks.onStartActivityFromFragment--->Fragment.startActivityFromFragment。
14、如何实现Fragment的滑动?
ViewPager嵌套Fragment即可实现滑动。
15、fragment之间传递数据的方式?
(1)、在创建的Fragment添加tag,使用bundle传值。
(2)、使用接口回调传值。
(3)、使用开源的EventBus传值。
作者:上善若水0819 链接:https://www.jianshu.com/p/79bf744ab4b2 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
# 3. 回调测试
# 添加Fragment对象显示
top.iqqcode.fragmentlife04 E/TAG: onAttach ---> 01
top.iqqcode.fragmentlife04 E/TAG: onCreate ---> 02
top.iqqcode.fragmentlife04 E/TAG: onCreateView ---> 03
top.iqqcode.fragmentlife04 E/TAG: onActivityCreated ---> 04
top.iqqcode.fragmentlife04 E/TAG: onStart ---> 05
top.iqqcode.fragmentlife04 E/TAG: onResume ---> 06
2
3
4
5
6
# Home回到桌面
top.iqqcode.fragmentlife04 E/TAG: onPause ---> 07
top.iqqcode.fragmentlife04 E/TAG: onStop ---> 08
2
# 回到应用
top.iqqcode.fragmentlife04 E/TAG: onStart ---> 05
top.iqqcode.fragmentlife04 E/TAG: onResume ---> 06
2
# replace Fragment02
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onAttach ---> 01
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onCreate ---> 02
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onCreateView ---> 03
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onActivityCreated ---> 04
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onStart ---> 05
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onResume ---> 06
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onPause ---> 07
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onStop ---> 08
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onDestroyView ---> 09
2
3
4
5
6
7
8
9
# remove
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onPause ---> 07
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onStop ---> 08
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onDestroyView ---> 09
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onDestroy ---> 10
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onDetach ---> 11
2
3
4
5
# Fragment02 返回 Fragment01
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onCreateView ---> 03
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onActivityCreated ---> 04
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onStart ---> 05
top.iqqcode.fragmentlife04 E/TAG: Fragment01 == onResume ---> 06
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onPause ---> 07
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onStop ---> 08
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onDestroyView ---> 09
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onDestroy ---> 10
top.iqqcode.fragmentlife04 E/TAG: Fragment02 == onDetach ---> 11
2
3
4
5
6
7
8
9
# 退出应用
top.iqqcode.fragmentlife04 E/TAG: onPause ---> 07
top.iqqcode.fragmentlife04 E/TAG: onStop ---> 08
top.iqqcode.fragmentlife04 E/TAG: onDestroyView ---> 09
top.iqqcode.fragmentlife04 E/TAG: onDestroy ---> 10
top.iqqcode.fragmentlife04 E/TAG: onDetach ---> 11
2
3
4
5