fragment各种情况下的生命周期?

发布于 2020-01-11 22:52:39
关注者
0
被浏览
5386
1 个回答
  • 面试哥
    面试哥 2020-01-11
    为面试而生,有面试问题,就找面试哥。

    由于Fragment的生命周期与Activity的生命周期有着牵扯,所以把两者的图放到一起作为对比理解。

     

    接下来就不同情况下的Fragment生命周期做一简单介绍:

    Fragment在Activity中replace 新替换的Activity:onAttach() ---> onCreate() ---> onCreatView() ---> onViewCreated ---> onActivityCreated() ---> onStart --->onResume()

    被替换的Activity:onPause() ---> onStop() ---> onDestoryView() ---> onDestory() ---> onDetach()

    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是否被切换到后台或前台,所以在这里也当作生命周期)

    如果相关的Fragment没有被加载过: NF: setUserVisibleHint(false)【用户不可见】 > onAttach > onCreate > setUserVisibleHint(true)【用户可见】 > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

    OF跟NF相邻: setUserVisibleHint(false) > onAttach > onCreate > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

    如果相关的Fragment已经被加载过: NF跟PF相邻 :setUserVisibleHint(true)

    NF跟PF不相邻:setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

    PF跟NF相邻 :setUserVisibleHint(false)

    PF跟NF不相邻:setUserVisibleHint(false) > onPause > onStop > onDestroyView

    OF跟PF相邻:onPause > onStop > onDestroyView

    OF跟NF相邻:onCreateView > onViewCreated > onActivityCreated > onStart > onResume

    OF夹在PF和NF中间:不调用任何生命周期方法

    NF跟PF相邻 :setUserVisibleHint(true)

    NF跟PF不相邻:setUserVisibleHint(true) > onCreateView > onViewCreated > onActivityCreated > onStart > onResume

    PF跟NF相邻 :setUserVisibleHint(false)

    PF跟NF不相邻:setUserVisibleHint(false) > onPause > onStop > onDestroyView

    OF跟PF相邻:onPause > onStop > onDestroyView

    OF跟NF相邻:onCreateView > onViewCreated > onActivityCreated > onStart > onResume

    OF夹在PF和NF中间:不调用任何生命周期方法

    如果重写了FragmentPagerAdapter的DestroyItem方法,并且相关的Fragment已经加载过: 相互切换时只会调用setUserVisibleHint

    Fragment进入了运行状态: Fragment在进入运行状态时,以下四个生命周期会随它所属的Activity一起被调用:

    onPause() ---> onStop() ---> onStart() ---> onResume()

    关于Fragment的onActivityResult方法: 使用Fragment的startActivity方法时,FragmentActivity的onActivityResult方法会回调相应的Fragment的onActivityResult方法,所以在重写FragmentActivity的onActivityResult方法时,注意调用super.onActivityResult。

知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看