关于活动和片段的生命周期,看了忘、忘了看。一提生命周期,大概一想,似乎明白,仔细一想,似乎不那么明白。索性,一不做二不休,写了个活动加上两个片段,覆盖所有的生命周期方法,打上Log一顿摆弄,直观的东西就出来了。所有的测试包括:1. 从Launcher启动活动2. 按回退键退出活动3. 按Home键将活动切入后台4. 将后台的活动切回前台5. 片段加载6. 片段2替换片段17. 运用回退栈处理片段调度的情况为什么要用“活动”、“片段”这样的中文术语而不用“activity”和“fragment”?因为输入法切换太麻烦。
首先针对单纯的活动,不看fragment。官方文档中给出的生命周期流程图:
- From Launcher: 创建、启动、继续
04-30 23:10:58.276: D/MainActivity(5433): ***** onCreate*****
04-30 23:10:58.276: D/MainActivity(5433): ***** onStart *****
04-30 23:10:58.276: D/MainActivity(5433): ***** onResume*****
- Quit by Back: 暂停、停止、销毁
04-30 23:11:42.876: D/MainActivity(5433): ***** onPause *****
04-30 23:11:43.436: D/MainActivity(5433): ***** onStop *****
04-30 23:11:43.461: D/MainActivity(5433): ***** onDestroy*****
- Switch out by Home: 暂停、保存状态、停止
04-30 23:11:58.871: D/MainActivity(5433): ***** onPause *****
04-30 23:11:59.631: D/MainActivity(5433): ***** onSaveInstanceState*****
04-30 23:11:59.661: D/MainActivity(5433): ***** onStop *****
- Switch in: 重启、启动、继续
04-30 23:12:27.836: D/MainActivity(5433): ***** onRestart*****
04-30 23:12:27.836: D/MainActivity(5433): ***** onStart *****
04-30 23:12:27.836: D/MainActivity(5433): ***** onResume*****
- Rotate screen: 暂停、保存状态、停止、销毁、创建、启动、回复状态、继续
04-30 23:12:49.876: D/MainActivity(5433): ***** onPause *****
04-30 23:12:49.876: D/MainActivity(5433): ***** onSaveInstanceState*****
04-30 23:12:49.876: D/MainActivity(5433): ***** onStop *****
04-30 23:12:49.876: D/MainActivity(5433): ***** onDestroy*****
04-30 23:12:50.051: D/MainActivity(5433): ***** onCreate*****
04-30 23:12:50.051: D/MainActivity(5433): ***** onStart *****
04-30 23:12:50.051: D/MainActivity(5433): *****onRestoreInstanceState *****
04-30 23:12:50.051: D/MainActivity(5433): ***** onResume*****
==================
现在加上fragment。
伴随activity的声明周期,官网文档给出了这样的示意图:
一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。
不过,fragment的生命周期并不总是伴随activity。因为activity处于就绪状态下也可以调度fragment(仅仅此时fragment的生命周期独立)。那么,官方文档所给的一般性fragment生命周期为:
- Launch:
活动:创建 ---------------------------- 启动 ---继续
<wbr><wbr><wbr><br>
片段:<wbr><wbr><wbr>挂靠 - 创建 -创建视图 - 活动创建 --- 启动 --- 继续<br>
04-30 23:29:44.776: D/MainActivity(6397): ***** onCreate*****<br>
04-30 23:29:44.811: D/Fragment1(6397): ----- onAttach -----<br>
04-30 23:29:44.811: D/Fragment1(6397): ----- onCreate -----<br>
04-30 23:29:44.811: D/Fragment1(6397): ----- onCreateView-----<br>
04-30 23:29:44.811: D/Fragment1(6397): ----- onActivityCreated-----<br>
04-30 23:29:44.811: D/MainActivity(6397): ***** onStart *****<br>
04-30 23:29:44.811: D/Fragment1(6397): ----- onStart -----<br>
04-30 23:29:44.811: D/MainActivity(6397): ***** onResume*****<br>
04-30 23:29:44.811: D/Fragment1(6397): ----- onResume -----<br><br>
- Quit<br>
活动:--- 暂停 --- 停止 ------------------------ 销毁<br>
片段:暂停 --- 停止 --- 销毁视图 --- 销毁 --- 脱离<br>
04-30 23:30:02.326: D/Fragment1(6397): ----- onPause -----<br>
04-30 23:30:02.331: D/MainActivity(6397): ***** onPause *****<br>
04-30 23:30:02.976: D/Fragment1(6397): ----- onStop -----<br>
04-30 23:30:02.981: D/MainActivity(6397): ***** onStop *****<br>
04-30 23:30:02.981: D/Fragment1(6397): ----- onDestroyView-----<br>
04-30 23:30:02.981: D/Fragment1(6397): ----- onDestroy -----<br>
04-30 23:30:02.986: D/Fragment1(6397): ----- onDetach -----<br>
04-30 23:30:02.986: D/MainActivity(6397): ***** onDestroy*****<br><br>
- Switch to bg<br>
活动:--- 暂停 --- 保存状态 --------------- 停止<br>
片段:暂停 --------------- 保存状态 --- 停止<br>
04-30 23:30:36.586: D/Fragment1(6397): ----- onPause -----<br>
04-30 23:30:36.586: D/MainActivity(6397): ***** onPause *****<br>
04-30 23:30:37.211: D/MainActivity(6397): ***** onSaveInstanceState*****<br>
04-30 23:30:37.231: D/Fragment1(6397): ----- onSaveInstanceState-----<br>
04-30 23:30:37.231: D/Fragment1(6397): ----- onStop -----<br>
04-30 23:30:37.231: D/MainActivity(6397): ***** onStop *****<br><br>
- Switch to foreground<br>
活动:重启 --- 启动 --- 继续<br>
片段:------------ 启动 --- 继续<br>
04-30 23:31:24.566: D/MainActivity(6397): ***** onRestart*****<br>
04-30 23:31:24.566: D/MainActivity(6397): ***** onStart *****<br>
04-30 23:31:24.566: D/Fragment1(6397): ----- onStart -----<br>
04-30 23:31:24.566: D/MainActivity(6397): ***** onResume*****<br>
04-30 23:31:24.566: D/Fragment1(6397): ----- onResume -----<br><br>
- Rotate<br>
这个。。。我有点乱。看了看代码,我加载片段用的方法是FragmentTransaction.replace()。<br>
活动销毁的时候,片段事务持有的片段实例并没有被干掉。当活动重建,这个实例跟着被恢复,然而在活动的onCreate()中又执行一次replace(),导致刚才恢复的实例被替换。<br>
04-30 23:46:30.881: D/Fragment1(7826): ----- onPause -----<br>
04-30 23:46:30.881: D/MainActivity(7826): ***** onPause *****<br>
04-30 23:46:30.881: D/MainActivity(7826): ***** onSaveInstanceState*****<br>
04-30 23:46:30.881: D/Fragment1(7826): ----- onSaveInstanceState-----<br>
04-30 23:46:30.881: D/Fragment1(7826): ----- onStop -----<br>
04-30 23:46:30.881: D/MainActivity(7826): ***** onStop *****<br>
04-30 23:46:30.886: D/Fragment1(7826): ----- onDestroyView-----<br>
04-30 23:46:30.886: D/Fragment1(7826): ----- onDestroy -----<br>
04-30 23:46:30.886: D/Fragment1(7826): ----- onDetach -----<br>
04-30 23:46:30.886: D/MainActivity(7826): ***** onDestroy*****<br>
04-30 23:46:31.001: D/MainActivity(7826): ***** onCreate*****<br>
04-30 23:46:31.001: D/Fragment1(7826): ----- onAttach -----<br>
04-30 23:46:31.001: D/Fragment1(7826): ----- onCreate -----<br>
04-30 23:46:31.046: D/Fragment1(7826): ----- onCreateView-----<br>
04-30 23:46:31.051: D/Fragment1(7826): ----- onActivityCreated-----<br>
04-30 23:46:31.051: D/Fragment1(7826): ----- onDestroyView-----<br>
04-30 23:46:31.051: D/Fragment1(7826): ----- onDestroy -----<br>
04-30 23:46:31.051: D/Fragment1(7826): ----- onDetach -----<br>
04-30 23:46:31.051: D/Fragment1(7826): ----- onAttach -----<br>
04-30 23:46:31.051: D/Fragment1(7826): ----- onCreate -----<br>
04-30 23:46:31.051: D/Fragment1(7826): ----- onCreateView-----<br>
04-30 23:46:31.056: D/Fragment1(7826): ----- onActivityCreated-----<br>
04-30 23:46:31.056: D/MainActivity(7826): ***** onStart *****<br>
04-30 23:46:31.056: D/Fragment1(7826): ----- onStart -----<br>
04-30 23:46:31.056: D/MainActivity(7826): *****onRestoreInstanceState *****<br>
04-30 23:46:31.056: D/MainActivity(7826): ***** onResume*****<br>
04-30 23:46:31.056: D/Fragment1(7826): ----- onResume -----<br><br>
- Switch to another fragment (with no back stack)<br><br>
05-01 00:17:30.321: D/Fragment1(9442): ----- onPause -----<br>
05-01 00:17:30.321: D/Fragment1(9442): ----- onStop -----<br>
05-01 00:17:30.321: D/Fragment1(9442): ----- onDestroyView-----<br>
05-01 00:17:30.326: D/Fragment1(9442): ----- onDestroy -----<br>
05-01 00:17:30.326: D/Fragment1(9442): ----- onDetach -----<br>
05-01 00:17:30.326: D/Fragment2(9442): ===== onAttach =====<br>
05-01 00:17:30.326: D/Fragment2(9442): ===== onCreate =====<br>
05-01 00:17:30.331: D/Fragment2(9442): ===== onCreateView=====<br>
05-01 00:17:30.341: D/Fragment2(9442): ===== onActivityCreated=====<br>
05-01 00:17:30.341: D/Fragment2(9442): ===== onStart =====<br>
05-01 00:17:30.341: D/Fragment2(9442): ===== onCreate =====<br><br>
- - Switch to another fragment (with back stack)<br>
05-01 00:26:16.646: D/Fragment1(9768): ----- onPause -----<br>
05-01 00:26:16.661: D/Fragment1(9768): ----- onStop -----<br>
05-01 00:26:16.661: D/Fragment1(9768): ----- onDestroyView-----<br>
05-01 00:26:16.661: D/Fragment2(9768): ===== onAttach =====<br>
05-01 00:26:16.661: D/Fragment2(9768): ===== onCreate =====<br>
05-01 00:26:16.671: D/Fragment2(9768): ===== onCreateView=====<br>
05-01 00:26:16.676: D/Fragment2(9768): ===== onActivityCreated=====<br>
05-01 00:26:16.676: D/Fragment2(9768): ===== onStart =====<br>
05-01 00:26:16.676: D/Fragment2(9768): ===== onCreate =====<br><br><br>
- Back from F2 to F1 (by addToBackStack())<br>
05-01 00:20:05.161: D/Fragment2(9768): ===== onPause =====<br>
05-01 00:20:05.161: D/Fragment2(9768): ===== onStop =====<br>
05-01 00:20:05.161: D/Fragment2(9768): ===== onDestroyView=====<br>
05-01 00:20:05.176: D/Fragment2(9768): ===== onDestroy =====<br>
05-01 00:20:05.176: D/Fragment2(9768): ===== onDetach =====<br>
05-01 00:20:05.181: D/Fragment1(9768): ----- onCreateView-----<br>
05-01 00:20:05.201: D/Fragment1(9768): ----- onActivityCreated-----<br>
05-01 00:20:05.201: D/Fragment1(9768): ----- onStart -----<br>
05-01 00:20:05.206: D/Fragment1(9768): ----- onResume -----<br><br>
- Rotate after switch from F1 to F2 with back stack: afterrotation, back to F1<br><br>
05-01 00:31:52.796: D/Fragment2(9768): ===== onPause =====<br>
05-01 00:31:52.796: D/MainActivity(9768): ***** onPause *****<br>
05-01 00:31:52.796: D/MainActivity(9768): ***** onSaveInstanceState*****<br>
05-01 00:31:52.801: D/Fragment1(9768): ----- onSaveInstanceState-----<br>
05-01 00:31:52.801: D/Fragment2(9768): ===== onSaveInstanceState=====<br>
05-01 00:31:52.801: D/Fragment2(9768): ===== onStop =====<br>
05-01 00:31:52.801: D/MainActivity(9768): ***** onStop *****<br>
05-01 00:31:52.801: D/Fragment1(9768): ----- onDestroy -----<br>
05-01 00:31:52.801: D/Fragment1(9768): ----- onDetach -----<br>
05-01 00:31:52.801: D/Fragment2(9768): ===== onDestroyView=====<br>
05-01 00:31:52.806: D/Fragment2(9768): ===== onDestroy =====<br>
05-01 00:31:52.806: D/Fragment2(9768): ===== onDetach =====<br>
05-01 00:31:52.806: D/MainActivity(9768): ***** onDestroy*****<br>
05-01 00:31:52.906: D/MainActivity(9768): ***** onCreate*****<br>
05-01 00:31:52.906: D/Fragment1(9768): ----- onAttach -----<br>
05-01 00:31:52.906: D/Fragment1(9768): ----- onCreate -----<br>
05-01 00:31:52.906: D/Fragment2(9768): ===== onAttach =====<br>
05-01 00:31:52.906: D/Fragment2(9768): ===== onCreate =====<br>
05-01 00:31:52.951: D/Fragment2(9768): ===== onCreateView=====<br>
05-01 00:31:52.951: D/Fragment2(9768): ===== onActivityCreated=====<br>
05-01 00:31:52.956: D/Fragment2(9768): ===== onDestroyView=====<br>
05-01 00:31:52.956: D/Fragment1(9768): ----- onAttach -----<br>
05-01 00:31:52.956: D/Fragment1(9768): ----- onCreate -----<br>
05-01 00:31:52.956: D/Fragment1(9768): ----- onCreateView-----<br>
05-01 00:31:52.956: D/Fragment1(9768): ----- onActivityCreated-----<br>
05-01 00:31:52.956: D/MainActivity(9768): ***** onStart *****<br>
05-01 00:31:52.956: D/Fragment1(9768): ----- onStart -----<br>
05-01 00:31:52.956: D/MainActivity(9768): *****onRestoreInstanceState *****<br>
05-01 00:31:52.956: D/MainActivity(9768): ***** onResume*****<br>
05-01 00:31:52.956: D/Fragment1(9768): ----- onResume -----</wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
相关推荐
Activity Fragment 生命周期研究
android-lifecycle, Android Activity/fragment 生命周期的图表 完整的Android fragment & Activity 生命周期尝试了解各种各样的片段之后,我做了一些研究并将完整的Android Activity/fragment 生命周期结合起来。...
Android Activity和Fragment的生命周期测试代码,没事的时候可以玩玩。
Android Activity ABC页面跳转生命周期变化及activity + fragment生命周期变化
详情见博客:https://blog.csdn.net/qq_20785431/article/details/100519075
工厂模式下add replace show hide fragment 还有Activity fragment生命周期
Android Activity 和 Fragment 生命周期 了解 Android Activity 和 Fragment 生命周期。 每个生命周期回调方法在回调方法执行的开始和结束时都有一个日志消息输出。 活动和片段的生命周期都被跟踪。 有用的快捷键 ...
Android下的Activity和Fragment的生命周期,详细的说明了Activity的状态保存,并说明Activity在屏幕旋转等特定的情况下的生命周期的变化
activity和fragment的生命周期以及intent跳转
1.打开app: -MainActivity-->onCreate -MyFragment-->onAttach -MyFragment-->onCreate -MyFragment-->>onCreateView -MyFragment-->onActivityCreated -MainActivity-->...onDestroy
随着Android系统的多样化,不仅仅在手机上,在平板、... 我们可以把Fragment看作是Activity的一个界面或者组成部分,而且Fragment具有与Activity很相似的生命周期,我们可以在Activity中动态的添加或者移除某个Fragment。
Fragment生命周期,Frament生命周期和Activity生命周期的关系。Fragment的生命周期方法何时回调。
在努力弄清楚各个部分如何组合之后,我进行了一些研究,并整理了完整的Android Activity / Fragment生命周期图。 它具有两个并行的生命周期(活动和片段),它们按时间垂直排列。 生命周期阶段将按照活动和片段的...
诚如其名,你可以把Fragment当作是Activity的模块化组件,它拥有自己的生命周期和UI,接受自身的处理事件,可以在Activity运行中被动态的添加、移除、替换。 Fragment必须被写成可重用的模块,你可以将多个Fragment...
android bind life activity fragment 生命周期 绑定
例子主要包括Fragment与Activity之间的通信,代码中还给出了两者之间通信具体调用的函数及其顺序。
主要介绍了Android应用开发中Fragment生命周期的控制,Fragment依赖于Activity,所以生命周期方面也受Activity的影响,需要的朋友可以参考下
Fragment的生命周期依托FragmentActivity管理调度,在FragmentActivity的各个生命周期方法回调中,会将对应生命状态派发给依附于FragmentActivity的所有Fragment。 图1.Fragment 生命周期 源码探究 文中源码基于’...
管理fragment的生命周期有些像管理activity的生命周期。Fragment可以生存在三种状态: Resumed: Fragment在一个运行中的activity中并且可见。 Paused: 另一个activity处于最顶层,但是fragment所在的activity并没有...
主要介绍了Android中Fragment与Activity的生命周期对比,Fragment是在Activity的基础之上进行设计的,比Activity多出几个控制生命周期的回调函数,需要的朋友可以参考下