Fragment聲明週期 開發遇到的問題

Activity A(MainActivity)中添加了一個Fragment,在Fragment中啓動另一個Activity B,在執行B.finish(),A.finish()生命週期如下

01-12 11:01:00.555: I/System.out(18028): MainActivity onCreate ....
01-12 11:01:00.555: I/System.out(18028): FragmentManager{42283648 in MainActivity{422833e8}}


01-12 11:51:03.790: E/FragmentOne(28346): Fragment  -> onAttach
01-12 11:51:03.790: E/FragmentOne(28346): Fragment  -> onCreate
01-12 11:51:03.800: E/FragmentOne(28346): Fragment  -> onCreateView: 
01-12 11:51:03.800: E/FragmentOne(28346): Fragment  -> onActivityCreated
01-12 11:51:03.800: E/FragmentOne(28346): Fragment  -> onStart
01-12 11:51:03.800: I/System.out(28346): MainActivity onResume ....
01-12 11:51:03.800: E/FragmentOne(28346): Fragment  -> onResume


//按Home鍵
01-12 11:53:43.960: I/System.out(28346): MainActivity onPause ....
01-12 11:53:43.965: E/FragmentOne(28346): Fragment  -> onPause
01-12 11:53:44.655: I/System.out(28346): MainActivity onStop ....
01-12 11:53:44.660: E/FragmentOne(28346): Fragment  -> onStop


//點擊桌面圖標重新啓動
01-12 11:53:49.500: I/System.out(28346): MainActivity onRestart ....
01-12 11:53:49.500: E/FragmentOne(28346): Fragment  -> onStart
01-12 11:53:49.500: I/System.out(28346): MainActivity onResume ....
01-12 11:53:49.500: E/FragmentOne(28346): Fragment  -> onResume


//Fragment中啓動Activity B
01-12 11:51:33.775: I/System.out(28346): MainActivity onPause ....
01-12 11:51:33.775: E/FragmentOne(28346): Fragment  -> onPause
01-12 11:51:33.995: I/System.out(28346): MainActivity onStop ....
01-12 11:51:33.995: E/FragmentOne(28346): Fragment  -> onStop


//執行B.finish(),執行onActivityResult在獲取參數值name
01-12 11:51:52.325: E/FragmentOne(28346): Fragment  -> onActivityResult:0 name: 
01-12 11:51:52.325: I/System.out(28346): MainActivity onRestart ....
01-12 11:51:52.325: E/FragmentOne(28346): Fragment  -> onStart
01-12 11:51:52.325: I/System.out(28346): MainActivity onResume ....
01-12 11:51:52.325: E/FragmentOne(28346): Fragment  -> onResume


 
//執行A.finish()
01-12 11:52:04.310: I/System.out(28346): MainActivity onPause ....
01-12 11:52:04.310: E/FragmentOne(28346): Fragment  -> onPause
01-12 11:52:05.035: I/System.out(28346): MainActivity onStop ....
01-12 11:52:05.035: E/FragmentOne(28346): Fragment  -> onStop
01-12 11:52:05.035: I/System.out(28346): MainActivity onDestroy ....
01-12 11:52:05.035: E/FragmentOne(28346): Fragment  -> onDestroyView
01-12 11:52:05.035: E/FragmentOne(28346): Fragment  -> onDestroy
01-12 11:52:05.035: E/FragmentOne(28346): Fragment  -> onDetach


//Activity裏面放入Fragment時,先執行Activity的方法,緊接着調用Fragment對應的方法

 
// MainActivity啓動FragmentPagerActivity,FragmentPagerActivity裏面有四個Fragment,剛開始添加了A和B
01-12 11:57:36.550: I/System.out(28346): MainActivity onPause ....
01-12 11:57:36.550: E/FragmentOne(28346): Fragment  -> onPause
01-12 11:57:36.580: I/System.out(28346): FragmentPagerActivity onCreate ....
01-12 11:57:36.580: I/System.out(28346): FragmentPagerActivity onResume ....
01-12 11:57:36.595: E/FragmentOne(28346): Fragment A -> onAttach
01-12 11:57:36.595: E/FragmentOne(28346): Fragment A -> onCreate
01-12 11:57:36.600: E/FragmentOne(28346): Fragment A -> onCreateView: 
01-12 11:57:36.600: E/FragmentOne(28346): Fragment A -> onActivityCreated
01-12 11:57:36.600: E/FragmentOne(28346): Fragment A -> onStart
01-12 11:57:36.600: E/FragmentOne(28346): Fragment A -> onResume
01-12 11:57:36.600: E/FragmentOne(28346): Fragment B -> onAttach
01-12 11:57:36.600: E/FragmentOne(28346): Fragment B -> onCreate
01-12 11:57:36.605: E/FragmentOne(28346): Fragment B -> onCreateView: 
01-12 11:57:36.605: E/FragmentOne(28346): Fragment B -> onActivityCreated
01-12 11:57:36.605: E/FragmentOne(28346): Fragment B -> onStart
01-12 11:57:36.605: E/FragmentOne(28346): Fragment B -> onResume


///A滑向B創建了C,此時標籤在B
01-12 11:57:59.345: E/FragmentOne(28346): Fragment C -> onAttach
01-12 11:57:59.345: E/FragmentOne(28346): Fragment C -> onCreate
01-12 11:57:59.350: E/FragmentOne(28346): Fragment C -> onCreateView: 
01-12 11:57:59.350: E/FragmentOne(28346): Fragment C -> onActivityCreated
01-12 11:57:59.350: E/FragmentOne(28346): Fragment C -> onStart
01-12 11:57:59.350: E/FragmentOne(28346): Fragment C -> onResume




//B滑向C先將A執行到onDestroyView方法在創建D,此時標籤在C  
01-12 11:58:20.325: E/FragmentOne(28346): Fragment A -> onPause
01-12 11:58:20.325: E/FragmentOne(28346): Fragment A -> onStop
01-12 11:58:20.325: E/FragmentOne(28346): Fragment A -> onDestroyView
01-12 11:58:20.330: E/FragmentOne(28346): Fragment D -> onAttach
01-12 11:58:20.330: E/FragmentOne(28346): Fragment D -> onCreate
01-12 11:58:20.335: E/FragmentOne(28346): Fragment D -> onCreateView: 
01-12 11:58:20.335: E/FragmentOne(28346): Fragment D -> onActivityCreated
01-12 11:58:20.335: E/FragmentOne(28346): Fragment D -> onStart
01-12 11:58:20.335: E/FragmentOne(28346): Fragment D -> onResume






//C滑向D,先將B執行到onDestroyView方法
01-12 12:00:41.565: E/FragmentOne(28346): Fragment B -> onPause
01-12 12:00:41.565: E/FragmentOne(28346): Fragment B -> onStop
01-12 12:00:41.565: E/FragmentOne(28346): Fragment B -> onDestroyView


//D滑向C,將B重新創建到onResume狀態
01-12 12:01:47.750: E/FragmentOne(28346): Fragment B -> onCreateView: 
01-12 12:01:47.750: E/FragmentOne(28346): Fragment B -> onActivityCreated
01-12 12:01:47.750: E/FragmentOne(28346): Fragment B -> onStart
01-12 12:01:47.750: E/FragmentOne(28346): Fragment B -> onResume




//6 FragmentPagerActivity執行finish(),當前標籤在C上
01-12 12:02:36.780: I/System.out(28346): FragmentPagerActivity onPause ....
01-12 12:02:36.780: E/FragmentOne(28346): Fragment B -> onPause
01-12 12:02:36.780: E/FragmentOne(28346): Fragment C -> onPause
01-12 12:02:36.780: E/FragmentOne(28346): Fragment D -> onPause
//6.1  MainActivity回到resume狀態
01-12 12:02:36.790: I/System.out(28346): MainActivity onRestart ....
01-12 12:02:36.790: E/FragmentOne(28346): Fragment  -> onStart
01-12 12:02:36.790: I/System.out(28346): MainActivity onResume ....
01-12 12:02:36.790: E/FragmentOne(28346): Fragment  -> onResume


 //6.2  FragmentPagerActivity依次執行onStop,onDestroy。此時A已經在前面執行了onDestroyView方法,根據添加的
 //順序依次退出。可以看出FragmentManager只是消除了A的View,並沒有銷燬它的結構
01-12 12:02:36.905: I/System.out(28346): FragmentPagerActivity onStop ....
01-12 12:02:36.905: E/FragmentOne(28346): Fragment B -> onStop
01-12 12:02:36.905: E/FragmentOne(28346): Fragment C -> onStop
01-12 12:02:36.905: E/FragmentOne(28346): Fragment D -> onStop
01-12 12:02:36.905: I/System.out(28346): FragmentPagerActivity onDestroy ....
01-12 12:02:36.905: E/FragmentOne(28346): Fragment A -> onDestroy
01-12 12:02:36.905: E/FragmentOne(28346): Fragment A -> onDetach
01-12 12:02:36.905: E/FragmentOne(28346): Fragment B -> onDestroyView
01-12 12:02:36.910: E/FragmentOne(28346): Fragment B -> onDestroy
01-12 12:02:36.910: E/FragmentOne(28346): Fragment B -> onDetach
01-12 12:02:36.910: E/FragmentOne(28346): Fragment C -> onDestroyView
01-12 12:02:36.910: E/FragmentOne(28346): Fragment C -> onDestroy
01-12 12:02:36.910: E/FragmentOne(28346): Fragment C -> onDetach
01-12 12:02:36.910: E/FragmentOne(28346): Fragment D -> onDestroyView
01-12 12:02:36.910: E/FragmentOne(28346): Fragment D -> onDestroy
01-12 12:02:36.910: E/FragmentOne(28346): Fragment D -> onDetach
 

三、Fragment A啓動一個Activity,執行Activity.finish()方法,在A裏面的onActivityResult接收參數。ViewPager裏面所有擁有onResume狀態的Fragment都跟隨Activity生命週期在執行。
//當前標籤在A處於onRsume狀態的Fragment有A和B,因此他們都執行了。 
01-12 12:25:45.920: I/System.out(28346): FragmentPagerActivity onPause ....
01-12 12:25:45.920: E/FragmentOne(28346): Fragment A -> onPause
01-12 12:25:45.920: E/FragmentOne(28346): Fragment B -> onPause
01-12 12:25:46.080: I/System.out(28346): FragmentPagerActivity onStop ....
01-12 12:25:46.080: E/FragmentOne(28346): Fragment A -> onStop
01-12 12:25:46.080: E/FragmentOne(28346): Fragment B -> onStop
01-12 12:25:55.050: E/FragmentOne(28346): Fragment A -> onActivityResult:0 name: 
01-12 12:25:55.050: I/System.out(28346): FragmentPagerActivity onRestart ....
01-12 12:25:55.050: E/FragmentOne(28346): Fragment A -> onStart
01-12 12:25:55.050: E/FragmentOne(28346): Fragment B -> onStart
01-12 12:25:55.050: I/System.out(28346): FragmentPagerActivity onResume ....
01-12 12:25:55.050: E/FragmentOne(28346): Fragment A -> onResume
01-12 12:25:55.050: E/FragmentOne(28346): Fragment B -> onResume


結論:1、Activity生命週期方法的調用在Fragment相同生命週期方法之前。
2、ViewPager會將創建的Fragment執行到onResume方法,對於任一個Fragment其左邊和右邊只能緊挨着一個Fragment爲onResume。
比如剛開始A和B爲onResume,當A滑向B時創建C,在滑向C時沒有緊挨着的A就要執行到onDestroyView同時創建D。
3、ViewPager裏面所有擁有onResume狀態的Fragment都跟隨Activity生命週期在執行。
4、嵌套fragment時getActivity()第二次爲空 解決方法 http://www.tuicool.com/articles/2eM32a 或者將activity的context設置成靜態。
5、嵌套fragment時onActivityResult接收不到數據,解決方法getParentFragment().startActivityForResult()進行啓動,在傳遞到子Fragment中去。
6、關於Fragment 不響應onActivityResult的情況分析 http://blog.sina.com.cn/s/blog_5da93c8f0101o2k1.html


 














 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章