在使用Fragment时,发现自己其实对Fragment的生命周期不是分厂熟悉,查询一番,发现一张比较不错的图:
可见fragment的销毁还是很优雅地,一个一个的来。
下面贴一下 activity和fragment同时运行时候的 生命周期
开始启动:
05-07 05:55:08.553: I/Log(1990): oncreate
05-07 05:55:08.553: I/Log(1990): onAttach_Fragment
05-07 05:55:08.553: I/Log(1990): onCreate_Fragment
05-07 05:55:08.553: I/Log(1990): onCreateView_Fragment
05-07 05:55:08.553: I/Log(1990): onActivityCreated_Fragment
05-07 05:55:08.553: I/Log(1990): onStart
05-07 05:55:08.553: I/Log(1990): onStart_Fragment
05-07 05:55:08.553: I/Log(1990): onResume
05-07 05:55:08.553: I/Log(1990): onResume_Fragment
按下home按键
05-07 05:55:28.725: I/Log(1990): onPause_Fragment
05-07 05:55:28.725: I/Log(1990): onPause
05-07 05:55:29.221: I/Log(1990): onStop_Fragment
05-07 05:55:29.221: I/Log(1990): onStop
再回到界面
05-07 05:55:49.441: I/Log(1990): onRestart
05-07 05:55:49.441: I/Log(1990): onStart
05-07 05:55:49.441: I/Log(1990): onStart_Fragment
05-07 05:55:49.441: I/Log(1990): onResume
05-07 05:55:49.441: I/Log(1990): onResume_Fragment
销毁activity
05-07 05:59:02.293: I/Log(1990): onPause_Fragment
05-07 05:59:02.293: I/Log(1990): onPause
05-07 05:59:02.757: I/Log(1990): onStop_Fragment
05-07 05:59:02.757: I/Log(1990): onStop
05-07 05:59:02.757: I/Log(1990): onDestroyView_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy_Fragment
05-07 05:59:02.757: I/Log(1990): onDetach_Fragment
05-07 05:59:02.757: I/Log(1990): onDestroy
可以看出 当现实fragment的时候都先执行activity方法,当销毁的时候都是先执行 fragment的方法;
知道了Fragment的生命周期与Activity的生命周期,以后再做一些相关操作的时候,你可能就会游刃有余了。。。
看到一个经典的面试题:Fragment之间如何通讯?这里特意总结一下:
- 调用Fragment的setArgument方法;
Android比较推荐的一种传递数据的方式,android API;
- 通过静态方法传递参数;
这种方式比较简单明了,但是缺点是对多线程并发的支持,多线程下传递参数可能存在问题;
- 通过事件总线框架传递参数(EventBus,Otto);
通过事件总线的方式传递参数,这种方式比较简单明了,但是缺点是如果项目比较大的话可能会使项目代码有些凌乱;
- 通过getActivity方式获得activity进而传递参数;
一种比较取巧的传递参数方式,比较推荐这种方式,但是需要注意的是一定要判断getActivity的返回值是否为空;
- 通过广播的方式传递;
这种方式可能比较复杂,通过这种方式可能有些杀鸡用牛刀的赶脚;
- 通过接口回调的方式传递;
需要自定义接口回调函数,书写上比较复杂,但是简单实用;
以上就是Fragment之间传递参数的几种方式,个人比较推荐使用事件总线框架的方式,比较优雅和简单;
其他文章:
Android Fragment 深度解析