您的位置:首页 > 其它

Fragment声明周期 开发遇到的问题

2016-01-12 18:13 211 查看
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
 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: