`
qilixiang012
  • 浏览: 203110 次
文章分类
社区版块
存档分类
最新评论

android Activity和Fragment生命周期实践

 
阅读更多
关于活动和片段的生命周期,看了忘、忘了看。一提生命周期,大概一想,似乎明白,仔细一想,似乎不那么明白。索性,一不做二不休,写了个活动加上两个片段,覆盖所有的生命周期方法,打上Log一顿摆弄,直观的东西就出来了。
所有的测试包括:
1. 从Launcher启动活动
2. 按回退键退出活动
3. 按Home键将活动切入后台
4. 将后台的活动切回前台
5. 片段加载
6. 片段2替换片段1
7. 运用回退栈处理片段调度的情况

为什么要用“活动”、“片段”这样的中文术语而不用“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了。因此,只有当activityresumed状态时,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>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics