標籤:des android style blog http color 使用 io ar
上一篇部落格我們講到了,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顯示呢而是將它摧毀了?因為按下返回鍵之後,系統會移除一個後台堆棧中的Fragment並將它摧毀,所以這裡調用了onDestroy--》onDetach方法,將Fragment1摧毀了,而不是將它顯示出來!!!
我們可以看到執行順序為:
Fragment2:Activity的onPause--》onPause--》Activity的onStop--》onStop--》Activity的onDestory--》onDestroyView--》onDestory--》onDetach
三、源碼下載
這是生命週期測試的源碼,如果對上面所講述的還是不清楚,那麼可以下載源碼,自己運行一下。點我下載。
下一節我還會針對Fragment的詳細使用進行解析,歡迎訂閱。我的CSDN部落格:http://blog.csdn.net/u010049692/article/details/38926561
【Android開發】之Fragment生命週期