上一篇博客我們講到了,Fragment的基本使用,相信大家都已經了解怎么去使用了。如果還有不懂得同學可以去看一下,傳送門。現在我們來講解一下Fragment的生命周期。
一、Fragment的事務
再講Fragment的生命周期之前,一定要講一下FragmentTransaction也就是fragment的事務,這對我們理解生命周期有很重要的作用。
那么什么是事務?根據用戶的交互情況,對fragment進行添加(add)、移除(remove)、替換(replace),以及執行其他動作,提交給activity的每一套變化,被稱為一個事務。事務當中存在一個堆棧的數據結構,它允許用戶經由fragment的變化往回導航(就是和activity回跳類似,這和activity之間跳轉實現都是一樣的,均用堆棧實現)。用戶可以通過添加FragmentTransaction.addToBackStack(null)函數(一定要在FragmentTrasaction.commit()之前調用),將此Fragment添加到后台堆棧。了解了事務之后我們再來看一下Fragment的生命周期。
二、Fragment生命周期
上篇有提到我們將Fragment看成是“小Activity”,相信熟知activity的同學都知道,掌握Activity的生命周期在安卓開發中是很有必要的。下面就為大家帶來Fragment的生命周期圖,並且通過幾個小例子來深度理解Fragment生命周期。
一、我們先創建一個Fragment1(沒有將它加入到后台堆棧中,即沒有調用FragmentTransaction.addToBackStack(null)函數)並將它顯示,查看Logcat:
我們發現,當Fragment1被創建的時候,調用的順序為:
Fragment1:onAttach--》--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume
- 現在我們用Fragment2(也沒有添加到后台堆棧),采用replace的方法將Fragment1替換掉,會出現什么樣的情況:
觀察Logcat,我們發現這個時候它的執行順序是:
Fragment1:onPause--》onStop--》onDestroyView--》onDestroy--》onDetach
Fragment2:onAttach--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume
二、如果我們在創建Fragment1的時候,將它加入到后台堆棧中(即調用FragmentTransaction.addToBackStack(null)函數),那么結果會是怎么樣子的呢?當然Fragment1的執行順序還是和原來一樣。
- 我們重點來看一下,用Fragment2(采用添加到后台堆棧),采用replace的方法將Fragment1替換掉,會出現什么樣的情況:
這時候我們看到,它的執行順序是:
Fragment1:onPause--》onStop--》onDestroyView。這里並沒有執行onDestroy--》onDetach,這是因為我們將Fragment1添加到后台堆棧中了,所以並沒有摧毀掉Fragment1
Fragment2:onAttach--》Activity的onAttachFragment--》onCreate--》onCreateView--》onActivityCreated--》onStart--》onResume
- 現在我們按下返回鍵,此時Fragment1將再次顯示出來:
這時候我們看到,它的執行順序是:
Fragment1:onCreateView--》onActivityCreated--》onStart--》onResume
Fragment2:onPause--》onStop--》onDestroyView--》onDestroy--》onDetach
三、這時候有同學會問了,如果我們啟動Fragment2的時候,沒有將他加入到后台堆棧中呢?按下返回鍵后,他的調用又是怎么樣的呢?那么讓我們來看一下:
我們可以看到執行順序為:
Fragment1:onDestroy--》onDetach
為什么會這樣呢?是不是很奇怪?為什么不調用Fragment1顯示呢而是將它摧毀了?因為按下返回鍵之后,我們的Fragment2是通過replace的方式添加的,所以它就先執行remove然后在add Fragment到主界面當中。所以不存在Fragment1了,就調用了onDestroy--》onDetach
- 再次按下返回鍵:
我們可以看到執行順序為:
Fragment2:Activity的onPause--》onPause--》Activity的onStop--》onStop--》Activity的onDestory--》onDestroyView--》onDestory--》onDetach
三、源碼下載
這是生命周期測試的源碼,如果對上面所講述的還是不清楚,那么可以下載源碼,自己運行一下。點我下載。