一、生命周期祖传图片
二、Activity和Fragment生命周期比较图片
三、生命周期各个周期的方法说明
onAttach:
onAttach()在fragment与Activity关联之后调用。需要注意的是,初始化fragment参数可以从getArguments()获得,但是,当Fragment附加到Activity之后,就无法再调用setArguments()。所以除了在最开始时,其它时间都无法向初始化参数添加内容。onCreate:
fragment初次创建时调用。它看起来像是Activity的OnCreate()函数,但这个只是用来创建Fragment的。此时的Activity还没有创建完成,因为我们的Fragment也是Activity创建的一部分。所以如果你想在这里使用Activity中的一些资源,将会获取不到。比如:获取同一个Activity中其它Frament的控件实例。如果想要获得Activity相关联的资源,必须在onActivityCreated中获取。onCreateView:
在这个fragment构造它的用户接口视图(即布局)时调用。onActivityCreated:
在Activity的OnCreate()结束后,会调用此方法。所以到这里的时候,Activity已经创建完成!在这个函数中才可以使用Activity的所有资源。onStart:
当到OnStart()时,Fragment对用户就是可见的了。但用户还未开始与Fragment交互。在生命周期中也可以看到Fragment的OnStart()过程与Activity的OnStart()过程是绑定的。意义即是一样的。以前你写在Activity的OnStart()中来处理的代码,用Fragment来实现时,依然可以放在OnStart()中来处理。onResume:
当这个fragment对用户可见并且正在运行时调用。这是Fragment与用户交互之前的最后一个回调。从生命周期对比中,可以看到,Fragment的OnResume与Activity的OnResume是相互绑定的,意义是一样的。它依赖于包含它的activity的Activity.onResume。当OnResume()结束后,就可以正式与用户交互了。onPause:
此回调与Activity的OnPause()相绑定,与Activity的OnPause()意义一样。onStop:
这个回调与Activity的OnStop()相绑定,意义一样。已停止的Fragment可以直接返回到OnStart()回调,然后调用OnResume()。onDestroyView:
如果Fragment即将被结束或保存,那么撤销方向上的下一个回调将是onDestoryView()。会将在onCreateView创建的视图与这个fragment分离。下次这个fragment若要显示,那么将会创建新视图。这会在onStop之后和onDestroy之前调用。这个方法的调用同onCreateView是否返回非null视图无关。它会潜在的在这个视图状态被保存之后以及它被它的父视图回收之前调用。onDestroy:
当这个fragment不再使用时调用。需要注意的是,它即使经过了onDestroy()阶段,但仍然能从Activity中找到,因为它还没有Detach。onDetach:
Fragment生命周期中最后一个回调是onDetach()。调用它以后,Fragment就不再与Activity相绑定,它也不再拥有视图层次结构,它的所有资源都将被释放。
四、Fragment的添加方式
Fragment的添加分为动态添加和静态添加。
1. 静态添加:
在XML文件中直接在layout文件中添加<fragment>简单方便,缺点是也是十分明显,就是添加之后就是不能删除。
2. 动态添加:
在代码中FragmentManger使用一系列的操作动态控制,灵活多变。一般都是通过动态添加的方式。
add方式生命周期:
onAttach->onCreate->onCreateView->onActivityCreated->onStart->onResumeremove方式生命周期:
onPause->onStop->onDestroyView->onDestroy->onDetachreplace方式生命周期:
旧Fragment走remove生命周期->新Fragment走add生命周期replace+addToBackStack方式生命周期:
onPause->onStop->onDestroyView->新Fragment的add生命周期
之后点击back:新Fragment的remove->onCreateView->onViewCreated->onActivityCreated->onStart->onResume 就是第一张图的线-
detach方式生命周期:
onPause->onStop->onDestroyView 可以看到只是视图被移除,Fragment关联状态还是不变,还是处于FragmentManger的管理下FragmentTransaction.attach(Fragment var1):onStart->onResume->onCreateView
Fragment展示 show:
onHiddenChanged(boolean hidden) hidden为false
Fragment隐藏 hide:
onHiddenChanged(boolean hidden) hidden为true
五、Fragment生命周期的变化
Fragment创建:onAttach() --> onCreate() --> onStart() -- >onResume()
Fragment销毁:onPause() --> onStop() --> onDestroyView() --> onDestroy() --> onDetach()
按下Home键/锁屏:onPause() --> onStop()
从桌面回到Fragment/解锁:onStart() --> onResume()
切换到其他Fragment A-B:A执行的生命周期onPause() --- onStop() --- onDestroy() ,B执行的生命周期:onCreateView() --- onActivityCreated() --- onStart() ---onResume()
六、Fragment回退栈说明
Activity是以压栈和出栈的方式来进行一个Activity的切换,但是Fragment一般都是以销毁创建的方法来进行一个切换,所以我们可以将Fragment添加到回退栈中,这样我们的Fragment也就有了跟Activity一样的栈管理。
Fragment回退栈中的一些方法
- addToBackStack(tag):将Fragment添加到回退栈中
- getBackStackImmediate():立刻销毁回退栈中栈顶的Fragment
- popBackStack():销毁回退栈中栈顶的Fragment
- getBackStackEntryAt(int index):获取回退栈中该索引值下的Fragment
- getBackStackEntryCount():获取Fragment回退栈中的Fragment个数