1. Fragment的生命周期和Activity的生命周期
Fragment是依附于Activity而存在的,当Activity在onCreate时,Fragment会进行onAttach, onCreate, onCreateView, onActivityCreated;当Activity进行onStart时,Fragment会进行onStart;而当Activity进行onResume时,Fragment也会onResume;当Activity进行onStop时,Fragment也会进行onStop;当Activity进行onDestroy时,Fragment也会进行onDestroryView,onDestroy,onDetach。
现在我们有三个Fragment:f1, f2, f3,有一个Activity:a
在FragmentTransaction中我们知道主要用到的方法有,add, replace, remove, hide, show, attach, detach, 还有一个比较关键的addToStack。
我将对这些方法做实验,来探究Fragment的生命周期:
Step1: 打开a
显示:a.onCreate, a.onStart, a.onResume
Step2: 点击按钮,将f1进行add到a中
显示:f1.onAttach, ..., f1. onResume
Step3:用f2去replacef1
显示:f1.onPause,...,f1.onDetach; f2.onStart, ..., f2.onResume
说明:replace是remove+add,所以f1生命周期结束
Step4: 用f3去replacef2,addToStack
显示:f2.onPause,...f2.onDestroyView, f3.onAttach, ..., f3.onResume
说明:replace中的remove由于addToStack存在,而并没有将f2完全结束,而是只是结束了视图,任然可以使用FragmentManager操作。addToStack是用于添加回退栈,用于返回,如果不天剑addToStack,点击回退键,则完全退出这个Acticity。
Step5:回退键
显示:f3.onPause,...f3.onDetach; f2.onCreateView, ..., f2.onResume
Step6:回退键
说明:此时退出了Acticity
第二次操作:
Step1: 打开a
显示:a.onCreate, a.onStart, a.onResume
Step2: 点击按钮,将f1进行add到a中
显示:f1.onAttach, ..., f1. onResume
Step3:点击按钮,将f1进行detach
显示:f1.onPause, ..., f1.onDestroyView
说明:和addToStack时候使用remove一样,都是仅仅删除视图。(注意:这里的detach和onDetach没有直接关系,不要混淆)
Step4:点击按钮,将f1进行attach
显示:f1.onCreateView, ..., f1.onResume
Step5:将f2进行add
显示:f2.onAttach, ..., f2.onResume
说明:可见一个FragmentLayout可以存储多个Fragment,只不过不能同时显示多个而已。这时显示的是后添加的f2
Step6: f1进行show
说明:f1显示出来
Step7:f1进行hide
说明:f1又消失了,f2显示。