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

本文详细解析了Android中Fragment与Activity之间的生命周期交互,包括如何在Fragment中启动Activity,以及如何在Activity中启动Fragment。重点阐述了在不同场景下如何正确地管理Fragment的生命周期,以及如何在嵌套使用Fragment时解决一些常见的问题,如Fragment不响应onActivityResult的情况,通过实例展示了如何避免和解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


 














 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值