1. 程式人生 > >android中fragment在後臺回收時的生命週期

android中fragment在後臺回收時的生命週期

頁面如下:activity可以切換fragment1,fragment2,初始狀態是fragment2,切fragment1的時候回給fragment1傳值,在實際測試中,發現app切後臺再進來時,傳的這個資料會報空。

先看宣告週期,開始的時候的:

03-15 10:20:19.378 14280-14280/com.dxxx.testfragmentcarsh E/activity: onCreate
03-15 10:20:19.414 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onAttach
03-15 10:20:19.414 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onCreate
03-15 10:20:19.420 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onCreateView
03-15 10:20:19.423 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onActivityCreated
03-15 10:20:19.423 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onViewStateRestored
03-15 10:20:19.424 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onStart
03-15 10:20:19.424 14280-14280/com.dxxx.testfragmentcarsh E/activity: onStart
03-15 10:20:19.424 14280-14280/com.dxxx.testfragmentcarsh E/activity: onResume
03-15 10:20:19.424 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onResume

很正常,跟想象的一樣,再切換到fragment1看看:

03-15 10:20:44.103 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onAttach
03-15 10:20:44.103 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onCreate
03-15 10:20:44.104 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onPause
03-15 10:20:44.104 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onDestroyView
03-15 10:20:44.105 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onDestroy
03-15 10:20:44.105 14280-14280/com.dxxx.testfragmentcarsh E/Fragment2: onDetach
03-15 10:20:44.107 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onCreateView  地址是:Fragment1{f1254d9 #1 id=0x7f0b0061}
03-15 10:20:44.117 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onActivityCreated
03-15 10:20:44.117 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onViewStateRestored
03-15 10:20:44.117 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onStart
03-15 10:20:44.117 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onResume

還是很正常,再後臺關閉下再看:

03-15 10:21:22.211 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onPause
03-15 10:21:22.212 14280-14280/com.dxxx.testfragmentcarsh E/activity: onPause
03-15 10:21:22.277 14280-14280/com.dxxx.testfragmentcarsh E/Fragment1: onSaveInstanceState
03-15 10:21:22.278 14280-14280/com.dxxx.testfragmentcarsh E/activity: onStop

再從前臺回來下:

03-15 10:22:29.515 16099-16099/com.dxxx.testfragmentcarsh E/Fragment1: onAttach
03-15 10:22:29.515 16099-16099/com.dxxx.testfragmentcarsh E/Fragment1: onCreate
03-15 10:22:29.781 16099-16099/com.dxxx.testfragmentcarsh E/activity: onCreate
03-15 10:22:29.796 16099-16099/com.dxxx.testfragmentcarsh E/Fragment1: onCreateView  地址是:Fragment1{30bef2a1 #1 id=0x7f0b0061}
03-15 10:22:29.799 16099-16099/com.dxxx.testfragmentcarsh E/Fragment1: onActivityCreated
03-15 10:22:29.799 16099-16099/com.dxxx.testfragmentcarsh E/Fragment1: onViewStateRestored
03-15 10:22:29.806 16099-16099/com.dxxx.testfragmentcarsh E/Fragment2: onAttach
03-15 10:22:29.806 16099-16099/com.dxxx.testfragmentcarsh E/Fragment2: onCreate
03-15 10:22:29.811 16099-16099/com.dxxx.testfragmentcarsh E/Fragment2: onCreateView
03-15 10:22:29.813 16099-16099/com.dxxx.testfragmentcarsh E/Fragment2: onActivityCreated
03-15 10:22:29.813 16099-16099/com.dxxx.testfragmentcarsh E/Fragment2: onViewStateRestored
03-15 10:22:29.813 16099-16099/com.dxxx.testfragmentcarsh E/Fragment1: onStart
03-15 10:22:29.813 16099-16099/com.dxxx.testfragmentcarsh E/Fragment2: onStart
03-15 10:22:29.813 16099-16099/com.dxxx.testfragmentcarsh E/activity: onStart
03-15 10:22:29.818 16099-16099/com.dxxx.testfragmentcarsh E/activity: onResume
03-15 10:22:29.818 16099-16099/com.dxxx.testfragmentcarsh E/Fragment1: onResume
03-15 10:22:29.818 16099-16099/com.dxxx.testfragmentcarsh E/Fragment2: onResume

會看到fragment1和fragment2都被重新例項化了,頁面中也能看到fragment1和fragment2.注意:這裡沒有做傳值的處理,否則就會發現fragment的那個傳的引數空指標了!

這裡因為activity被回收了,他在onsaveinstanc中儲存了頁面的資料,然後再次到前臺會進行恢復,activity恢復會走activity的oncraet方法,也就是把fragment2顯示出來,但是他在被銷燬前儲存了fragmen1的狀態,所有也去走了fragemnt1的宣告週期,但是傳的那個資料,已經不在了,就報空了。

解決辦法就是重寫activity的 onSavaInstance方法,直接寫空,那麼狀態就不會被儲存了。