背景介紹:
? 今天面試,面試官問了很多Java、android方面細節(jié)的事情,比如說String、StringBuffer、StringBuilder、CharSequenece之間的區(qū)別,lanuchMode的四種模式應(yīng)用場景、多線程的內(nèi)部處理機制。而令我最印象深刻的是ViewPager 中Fragment 與一般Fragment生命周期的區(qū)別 ?
? 雖然在項目中反復(fù)使用了viewPager、Fagment,但因為viewPager良好的封裝性,使得在簡單使用的時候不用了解更深層次的內(nèi)部結(jié)構(gòu)。但是,因為fagment真的太常用了,所以我們今天來聊一聊fragment復(fù)雜的生命周期。
一般Fragment生命周期
?fragment依賴于activity,所以他們生命周期是對應(yīng),順便說一下Application的生命周期是包含activity,activity生命周期包含fragment,現(xiàn)在我們看看下面官方給出的Fragment LifeCycle:

?生命周期:
1.onAttach(Activity): ?fragment 第一步是與activity綁定,當你想在這個階段做點什么,就可以在fagment中復(fù)寫這個方法;
2.onCreate(Bundle) : fragment 的 onCreate()方法;
3.onCreateView(LayoutInflater, ViewGroup, Bundle): ?這個方法用得比較多,一般用來inflate布局,還可以通過Bundle恢復(fù)數(shù)據(jù);
4.onActivityCreate(Bundle): ?當activity調(diào)用onCreate()并完成后,通知fragment調(diào)用這個方法;
5.onViewStateRestore(Bundle): ?保存下來的視圖層次結(jié)構(gòu)恢復(fù)成功后調(diào)用這方法;
6. onStart(): ? 對應(yīng)于activity的onStart()方法;
7.onResume(): ?對應(yīng)于activity 的onResume()方法,fragment開始可見,fragment只有處于這個階段才可以被替換或增加fagment,也就是說fragmentManager對fragment的管理只能在這個階段進行;
8.onPause(): ?fragment處于這個狀態(tài)有兩個原因;一是對應(yīng)的activity處于這個狀態(tài),二是正在對fragment進行某種操作(比如刪除fragment、替換fragment);
9.onStop(): ?與onPause()相似,同樣的兩個原因;
10. onDestroyView(): ?僅僅是清除視圖;
11. onDestroy(): ?調(diào)用此方法清除fragment的狀態(tài);
12. onDetach(): ? ?解除綁定;
以上就是一般的fragment(不與viewpager綁定;在layout中作為自定義控件,或者是在代碼中引用)的生命周期,它與activity有很密切的對應(yīng)關(guān)系,可以總結(jié)為如下邏輯圖:

ViewPager中fragment生命周期介紹:
?因為在ViewPager中fragment的管理是由adapter負責的。
對于FragmentPagerAdapter,當前視圖的上一頁僅視圖被銷毀了,所以它的onCreateView()會被調(diào)用到。
對于FragmentStatePagerAdapter,當前視圖的上一頁實例被銷毀了,所以getItem()會被再次調(diào)用,整個Fragment對應(yīng)的生命周期函數(shù)會再走一遍。
運行一個實例來說明:
下面是相關(guān)的生命周期函數(shù)調(diào)用情況:
當剛啟動一個Activity時,Activity和Fragment都將被創(chuàng)建:

當Activity進入后臺后:

當Activity返回前臺后:

當Activity被銷毀后:

最后總結(jié):viewpager 中 使用 FragmentPagerAdapter 管理fragment時 和fragment 壓到返回棧時都是調(diào)用onDestroyView() ———> onCreateView()來重新生成,而其他情況下都需要重新跑一遍生命周期。
注:Fragment的返回棧由Activity管理;而Activity的返回棧由系統(tǒng)管理
最后放一張概括周全的總結(jié)圖:

參考: ?01 https://segmentfault.com/q/1010000003719990
? ? ? ? ? ? 02?Android Fragment的生命周期和返回棧?
? ? ? ? ? ? 03?A Visualization of the Android Activity & Fragment Lifecycle