您的位置:首页 > 移动开发 > Android开发

Android:Activity和Fragment生命周期实践

2013-05-01 17:37 357 查看
关于活动和片段的生命周期,看了忘、忘了看。一提生命周期,大概一想,似乎明白,仔细一想,似乎不那么明白。索性,一不做二不休,写了个活动加上两个片段,覆盖所有的生命周期方法,打上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的声明周期,官网文档给出了这样的示意图:



不过,fragment的生命周期并不总是伴随activity。因为activity处于就绪状态下也可以调度fragment。那么,官方文档所给的一般性fragment生命周期为:



- Launch:

活动:创建 ---------------------------- 启动 ---继续

片段: 挂靠 - 创建 -创建视图 - 活动创建 --- 启动 --- 继续

04-30 23:29:44.776: D/MainActivity(6397): ***** onCreate*****

04-30 23:29:44.811: D/Fragment1(6397): ----- onAttach -----

04-30 23:29:44.811: D/Fragment1(6397): ----- onCreate -----

04-30 23:29:44.811: D/Fragment1(6397): ----- onCreateView-----

04-30 23:29:44.811: D/Fragment1(6397): ----- onActivityCreated-----

04-30 23:29:44.811: D/MainActivity(6397): ***** onStart *****

04-30 23:29:44.811: D/Fragment1(6397): ----- onStart -----

04-30 23:29:44.811: D/MainActivity(6397): ***** onResume*****

04-30 23:29:44.811: D/Fragment1(6397): ----- onResume -----

- Quit

活动:--- 暂停 --- 停止 ------------------------ 销毁

片段:暂停 --- 停止 --- 销毁视图 --- 销毁 --- 脱离

04-30 23:30:02.326: D/Fragment1(6397): ----- onPause -----

04-30 23:30:02.331: D/MainActivity(6397): ***** onPause *****

04-30 23:30:02.976: D/Fragment1(6397): ----- onStop -----

04-30 23:30:02.981: D/MainActivity(6397): ***** onStop *****

04-30 23:30:02.981: D/Fragment1(6397): ----- onDestroyView-----

04-30 23:30:02.981: D/Fragment1(6397): ----- onDestroy -----

04-30 23:30:02.986: D/Fragment1(6397): ----- onDetach -----

04-30 23:30:02.986: D/MainActivity(6397): ***** onDestroy*****

- Switch to bg

活动:--- 暂停 --- 保存状态 --------------- 停止

片段:暂停 --------------- 保存状态 --- 停止

04-30 23:30:36.586: D/Fragment1(6397): ----- onPause -----

04-30 23:30:36.586: D/MainActivity(6397): ***** onPause *****

04-30 23:30:37.211: D/MainActivity(6397): ***** onSaveInstanceState*****

04-30 23:30:37.231: D/Fragment1(6397): ----- onSaveInstanceState-----

04-30 23:30:37.231: D/Fragment1(6397): ----- onStop -----

04-30 23:30:37.231: D/MainActivity(6397): ***** onStop *****

- Switch to foreground

活动:重启 --- 启动 --- 继续

片段:------------ 启动 --- 继续

04-30 23:31:24.566: D/MainActivity(6397): ***** onRestart*****

04-30 23:31:24.566: D/MainActivity(6397): ***** onStart *****

04-30 23:31:24.566: D/Fragment1(6397): ----- onStart -----

04-30 23:31:24.566: D/MainActivity(6397): ***** onResume*****

04-30 23:31:24.566: D/Fragment1(6397): ----- onResume -----

- Rotate

这个。。。我有点乱。看了看代码,我加载片段用的方法是FragmentTransaction.replace()。

活动销毁的时候,片段事务持有的片段实例并没有被干掉。当活动重建,这个实例跟着被恢复,然而在活动的onCreate()中又执行一次replace(),导致刚才恢复的实例被替换。

04-30 23:46:30.881: D/Fragment1(7826): ----- onPause -----

04-30 23:46:30.881: D/MainActivity(7826): ***** onPause *****

04-30 23:46:30.881: D/MainActivity(7826): ***** onSaveInstanceState*****

04-30 23:46:30.881: D/Fragment1(7826): ----- onSaveInstanceState-----

04-30 23:46:30.881: D/Fragment1(7826): ----- onStop -----

04-30 23:46:30.881: D/MainActivity(7826): ***** onStop *****

04-30 23:46:30.886: D/Fragment1(7826): ----- onDestroyView-----

04-30 23:46:30.886: D/Fragment1(7826): ----- onDestroy -----

04-30 23:46:30.886: D/Fragment1(7826): ----- onDetach -----

04-30 23:46:30.886: D/MainActivity(7826): ***** onDestroy*****

04-30 23:46:31.001: D/MainActivity(7826): ***** onCreate*****

04-30 23:46:31.001: D/Fragment1(7826): ----- onAttach -----

04-30 23:46:31.001: D/Fragment1(7826): ----- onCreate -----

04-30 23:46:31.046: D/Fragment1(7826): ----- onCreateView-----

04-30 23:46:31.051: D/Fragment1(7826): ----- onActivityCreated-----

04-30 23:46:31.051: D/Fragment1(7826): ----- onDestroyView-----

04-30 23:46:31.051: D/Fragment1(7826): ----- onDestroy -----

04-30 23:46:31.051: D/Fragment1(7826): ----- onDetach -----

04-30 23:46:31.051: D/Fragment1(7826): ----- onAttach -----

04-30 23:46:31.051: D/Fragment1(7826): ----- onCreate -----

04-30 23:46:31.051: D/Fragment1(7826): ----- onCreateView-----

04-30 23:46:31.056: D/Fragment1(7826): ----- onActivityCreated-----

04-30 23:46:31.056: D/MainActivity(7826): ***** onStart *****

04-30 23:46:31.056: D/Fragment1(7826): ----- onStart -----

04-30 23:46:31.056: D/MainActivity(7826): *****onRestoreInstanceState *****

04-30 23:46:31.056: D/MainActivity(7826): ***** onResume*****

04-30 23:46:31.056: D/Fragment1(7826): ----- onResume -----

- Switch to another fragment (with no back stack)

05-01 00:17:30.321: D/Fragment1(9442): ----- onPause -----

05-01 00:17:30.321: D/Fragment1(9442): ----- onStop -----

05-01 00:17:30.321: D/Fragment1(9442): ----- onDestroyView-----

05-01 00:17:30.326: D/Fragment1(9442): ----- onDestroy -----

05-01 00:17:30.326: D/Fragment1(9442): ----- onDetach -----

05-01 00:17:30.326: D/Fragment2(9442): ===== onAttach =====

05-01 00:17:30.326: D/Fragment2(9442): ===== onCreate =====

05-01 00:17:30.331: D/Fragment2(9442): ===== onCreateView=====

05-01 00:17:30.341: D/Fragment2(9442): ===== onActivityCreated=====

05-01 00:17:30.341: D/Fragment2(9442): ===== onStart =====

05-01 00:17:30.341: D/Fragment2(9442): ===== onCreate =====

- - Switch to another fragment (with back stack)

05-01 00:26:16.646: D/Fragment1(9768): ----- onPause -----

05-01 00:26:16.661: D/Fragment1(9768): ----- onStop -----

05-01 00:26:16.661: D/Fragment1(9768): ----- onDestroyView-----

05-01 00:26:16.661: D/Fragment2(9768): ===== onAttach =====

05-01 00:26:16.661: D/Fragment2(9768): ===== onCreate =====

05-01 00:26:16.671: D/Fragment2(9768): ===== onCreateView=====

05-01 00:26:16.676: D/Fragment2(9768): ===== onActivityCreated=====

05-01 00:26:16.676: D/Fragment2(9768): ===== onStart =====

05-01 00:26:16.676: D/Fragment2(9768): ===== onCreate =====

- Back from F2 to F1 (by addToBackStack())

05-01 00:20:05.161: D/Fragment2(9768): ===== onPause =====

05-01 00:20:05.161: D/Fragment2(9768): ===== onStop =====

05-01 00:20:05.161: D/Fragment2(9768): ===== onDestroyView=====

05-01 00:20:05.176: D/Fragment2(9768): ===== onDestroy =====

05-01 00:20:05.176: D/Fragment2(9768): ===== onDetach =====

05-01 00:20:05.181: D/Fragment1(9768): ----- onCreateView-----

05-01 00:20:05.201: D/Fragment1(9768): ----- onActivityCreated-----

05-01 00:20:05.201: D/Fragment1(9768): ----- onStart -----

05-01 00:20:05.206: D/Fragment1(9768): ----- onResume -----

- Rotate after switch from F1 to F2 with back stack: afterrotation, back to F1

05-01 00:31:52.796: D/Fragment2(9768): ===== onPause =====

05-01 00:31:52.796: D/MainActivity(9768): ***** onPause *****

05-01 00:31:52.796: D/MainActivity(9768): ***** onSaveInstanceState*****

05-01 00:31:52.801: D/Fragment1(9768): ----- onSaveInstanceState-----

05-01 00:31:52.801: D/Fragment2(9768): ===== onSaveInstanceState=====

05-01 00:31:52.801: D/Fragment2(9768): ===== onStop =====

05-01 00:31:52.801: D/MainActivity(9768): ***** onStop *****

05-01 00:31:52.801: D/Fragment1(9768): ----- onDestroy -----

05-01 00:31:52.801: D/Fragment1(9768): ----- onDetach -----

05-01 00:31:52.801: D/Fragment2(9768): ===== onDestroyView=====

05-01 00:31:52.806: D/Fragment2(9768): ===== onDestroy =====

05-01 00:31:52.806: D/Fragment2(9768): ===== onDetach =====

05-01 00:31:52.806: D/MainActivity(9768): ***** onDestroy*****

05-01 00:31:52.906: D/MainActivity(9768): ***** onCreate*****

05-01 00:31:52.906: D/Fragment1(9768): ----- onAttach -----

05-01 00:31:52.906: D/Fragment1(9768): ----- onCreate -----

05-01 00:31:52.906: D/Fragment2(9768): ===== onAttach =====

05-01 00:31:52.906: D/Fragment2(9768): ===== onCreate =====

05-01 00:31:52.951: D/Fragment2(9768): ===== onCreateView=====

05-01 00:31:52.951: D/Fragment2(9768): ===== onActivityCreated=====

05-01 00:31:52.956: D/Fragment2(9768): ===== onDestroyView=====

05-01 00:31:52.956: D/Fragment1(9768): ----- onAttach -----

05-01 00:31:52.956: D/Fragment1(9768): ----- onCreate -----

05-01 00:31:52.956: D/Fragment1(9768): ----- onCreateView-----

05-01 00:31:52.956: D/Fragment1(9768): ----- onActivityCreated-----

05-01 00:31:52.956: D/MainActivity(9768): ***** onStart *****

05-01 00:31:52.956: D/Fragment1(9768): ----- onStart -----

05-01 00:31:52.956: D/MainActivity(9768): *****onRestoreInstanceState *****

05-01 00:31:52.956: D/MainActivity(9768): ***** onResume*****

05-01 00:31:52.956: D/Fragment1(9768): ----- onResume -----
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: