根据使用分五种情况:
- Fragment在Activity中replace新替换的Fragment:
onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume
被替换的Fragment:onPause > onStop > onDestroyView > onDestroy > onDetach
备注:addToBackStack()会在新Fragment启动之前保存旧的Fragment,当新的Fragment退出时,旧的Fragment就会重新加载
- Fragment在Activity中replace,并addToBackStack
如果新替换的Fragment没有在BackStack中:onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume
如果新替换的Fragment已经在BackStack中:onCreateView > onViewCreated > onActivityCreated > onStart > onResume
被替换的Fragment:onPause > onStop > onDestroyView
- Fragment在ViewPager中切换
这里有很多种情况,
切换前的的Fragment称为PreviousFragment,简称PF;
切换后的Fragment称为NextFragment,简称NF;
其他Fragment称为OtherFragment,简称OF。
(在ViewPager中setUserVisibleHint能反映出Fragment是否被切换到后台或前台,所以在这里也当作生命周期)
A、如果相关的Fragment没有被加载过:(多onAttach > onCreate 流程)
NF: setUserVisibleHint(false) > onAttach > onCreate > setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume
OF跟NF相邻: setUserVisibleHint(false) > onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume
- 如果相关的Fragment已经被加载过:(少onAttach > onCreate )
创建时:
NF跟PF相邻 :setUserVisibleHint(true)
相邻的会预先加载,所以放置前台即可
NF跟PF不相邻:setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume
不相邻则不会预先加载,故要重走一遍创建流程
OF跟NF相邻:onCreateView > onViewCreated > onActivityCreated > onStart > onResume
与切换后的界面相邻,需要预先加载,故启动创建流程
销毁时:
PF跟NF相邻 :setUserVisibleHint(false)
相邻放置后台即可,不必执行销毁
PF跟NF不相邻:setUserVisibleHint(false) > onPause > onStop > onDestroyView
不相邻,销毁即可
OF跟PF相邻:onPause > onStop > onDestroyView
与切换后的页面不相邻,销毁
OF夹在PF和NF中间:不调用任何生命周期方法
C、如果重写了FragmentPagerAdapter的destroyItem方法,并且相关Fragment已经加载过:
则相互切换时只会调用setUserVisibleHint
- Fragment进入了运行状态:
Fragment在上述的各种情况下进入了onResume后,则进入了运行状态,以下4个生命周期方法将跟随所属的Activity一起被调用:
onPause > onStop > onStart > onResume
- 关于Fragment的onActivityResult方法:
在重写FragmentActivity的onActivityResult方法时,注意调super.onActivityResult。因为在使用Fragment的startActivity方法时,FragmentActivity的onActivityResult方法会回调相应的Fragment的onActivityResult方法。