Activity和Fragment的生命周期的混合调用

由于对上述的生命周期的记忆混乱,特地从新进行了测试整理:

准备: 2个aicitivy   1个fragment

第一个activity里通过代码加载fragment


测试过程:

1 第一次加载activity1

03-23 01:44:44.937 3256-3256/com.example.test2 I/ceshi: oncreate-activity-1
03-23 01:44:44.937 3256-3256/com.example.test2 I/ceshi: onattach-fragment-1
03-23 01:44:44.937 3256-3256/com.example.test2 I/ceshi: onCreate-fragment-1
03-23 01:44:44.938 3256-3256/com.example.test2 I/ceshi: onCreateView-fragment-1
03-23 01:44:44.938 3256-3256/com.example.test2 I/ceshi: onActivityCreated-fragment-1
03-23 01:44:44.938 3256-3256/com.example.test2 I/ceshi: onStart-fragment-1
03-23 01:44:44.938 3256-3256/com.example.test2 I/ceshi: onStart-activity-1
03-23 01:44:44.938 3256-3256/com.example.test2 I/ceshi: onResume-activity-1
03-23 01:44:44.938 3256-3256/com.example.test2 I/ceshi: onResume-fragment-1

看到如上顺序,先activity1的oncreate,然后是frament的创建, 一口气走了5个fragment的方法.


2 点击回退键(和调用finish方法一样)

03-23 01:56:14.004 2897-2897/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:56:14.004 2897-2897/com.example.test2 I/ceshi: onPause-activity-1
03-23 01:56:14.631 2897-2897/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:56:14.631 2897-2897/com.example.test2 I/ceshi: onStop-activity-1
03-23 01:56:14.631 2897-2897/com.example.test2 I/ceshi: onDestroyView-fragment-1
03-23 01:56:14.633 2897-2897/com.example.test2 I/ceshi: onDestroy-fragment-1
03-23 01:56:14.633 2897-2897/com.example.test2 I/ceshi: onDetach-fragment-1
03-23 01:56:14.633 2897-2897/com.example.test2 I/ceshi: onDestroy-activity-1

销毁的时候显示fragment的生命周期被调用,直到onstop调用完成,然后才是fragment的完全销毁,最后activity销毁

3 手动调用finish

03-23 01:57:18.883 5768-5768/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:57:18.883 5768-5768/com.example.test2 I/ceshi: onPause-activity-1
03-23 01:57:19.705 5768-5768/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:57:19.705 5768-5768/com.example.test2 I/ceshi: onStop-activity-1
03-23 01:57:19.706 5768-5768/com.example.test2 I/ceshi: onDestroyView-fragment-1
03-23 01:57:19.706 5768-5768/com.example.test2 I/ceshi: onDestroy-fragment-1
03-23 01:57:19.706 5768-5768/com.example.test2 I/ceshi: onDetach-fragment-1
03-23 01:57:19.706 5768-5768/com.example.test2 I/ceshi: onDestroy-activity-1

确实和上面一样

4 从当前的fragment跳转到其他的activity中

03-23 01:57:46.946 5768-5768/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:57:46.946 5768-5768/com.example.test2 I/ceshi: onPause-activity-1
03-23 01:57:47.039 5768-5768/com.example.test2 I/ceshi: oncreate-activity-2
03-23 01:57:47.040 5768-5768/com.example.test2 I/ceshi: onStart-activity-2
03-23 01:57:47.040 5768-5768/com.example.test2 I/ceshi: onResume-activity-2
03-23 01:57:47.882 5768-5768/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:57:47.882 5768-5768/com.example.test2 I/ceshi: onStop-activity-1

fragment先onpause,然后是第二个activity的创建,当第二个activity的onresume完成后再关闭第一activty(是关闭不是销毁)

5 关闭第二个activity 返回第一个activity ,点击回退建或者手动调用finish

03-23 01:58:19.040 5768-5768/com.example.test2 I/ceshi: onPause-activity-2
03-23 01:58:19.043 5768-5768/com.example.test2 I/ceshi: onRestart-activity-1
03-23 01:58:19.044 5768-5768/com.example.test2 I/ceshi: onStart-fragment-1
03-23 01:58:19.044 5768-5768/com.example.test2 I/ceshi: onStart-activity-1
03-23 01:58:19.044 5768-5768/com.example.test2 I/ceshi: onResume-activity-1
03-23 01:58:19.044 5768-5768/com.example.test2 I/ceshi: onResume-fragment-1
03-23 01:58:19.635 5768-5768/com.example.test2 I/ceshi: onStop-activity-2
03-23 01:58:19.635 5768-5768/com.example.test2 I/ceshi: onDestroy-activity-2


二  下面是不同fragment的切换,  

 不使用回退栈的时候

1 add 方法

03-23 01:54:08.544 2897-2897/com.example.test2 I/ceshi: onattach-fragment-2
03-23 01:54:08.544 2897-2897/com.example.test2 I/ceshi: onCreate-fragment-2
03-23 01:54:08.545 2897-2897/com.example.test2 I/ceshi: onCreateView-fragment-2
03-23 01:54:08.545 2897-2897/com.example.test2 I/ceshi: onActivityCreated-fragment-2
03-23 01:54:08.545 2897-2897/com.example.test2 I/ceshi: onStart-fragment-2
03-23 01:54:08.545 2897-2897/com.example.test2 I/ceshi: onResume-fragment-2

2 remove 方法

03-23 01:52:00.927 32471-32471/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:52:00.927 32471-32471/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:52:00.927 32471-32471/com.example.test2 I/ceshi: onDestroyView-fragment-1
03-23 01:52:00.927 32471-32471/com.example.test2 I/ceshi: onDestroy-fragment-1
03-23 01:52:00.927 32471-32471/com.example.test2 I/ceshi: onDetach-fragment-1

3 replace 方法

03-23 01:52:55.264 1460-1460/com.example.test2 I/ceshi: onattach-fragment-2
03-23 01:52:55.265 1460-1460/com.example.test2 I/ceshi: onCreate-fragment-2
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onDestroyView-fragment-1
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onDestroy-fragment-1
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onDetach-fragment-1
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onCreateView-fragment-2
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onActivityCreated-fragment-2
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onStart-fragment-2
03-23 01:52:55.266 1460-1460/com.example.test2 I/ceshi: onResume-fragment-2


使用会退栈的时候   addToBackStack(null)

1 按下回退键

03-23 01:45:30.667 3256-3256/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:45:30.667 3256-3256/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:45:30.667 3256-3256/com.example.test2 I/ceshi: onDestroyView-fragment-1
03-23 01:45:30.667 3256-3256/com.example.test2 I/ceshi: onDestroy-fragment-1
03-23 01:45:30.667 3256-3256/com.example.test2 I/ceshi: onDetach-fragment-1

发现activity没有关闭,只是销毁了fragment

2  remove方法

03-23 01:49:43.820 29208-29208/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:49:43.820 29208-29208/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:49:43.820 29208-29208/com.example.test2 I/ceshi: onDestroyView-fragment-1

发现只是销毁了fragment里的view,fragment本身没销毁

3 2之后再点击回退键,

03-23 01:50:02.855 29208-29208/com.example.test2 I/ceshi: onCreateView-fragment-1
03-23 01:50:02.855 29208-29208/com.example.test2 I/ceshi: onActivityCreated-fragment-1
03-23 01:50:02.855 29208-29208/com.example.test2 I/ceshi: onStart-fragment-1
03-23 01:50:02.855 29208-29208/com.example.test2 I/ceshi: onResume-fragment-1

发现又重新创建了view,这里分析回退键是取消了上一次的操作,再点一次的话发现和1中是一样的。

4 replace

03-23 01:46:34.488 3256-3256/com.example.test2 I/ceshi: onattach-fragment-2
03-23 01:46:34.488 3256-3256/com.example.test2 I/ceshi: onCreate-fragment-2
03-23 01:46:34.488 3256-3256/com.example.test2 I/ceshi: onPause-fragment-1
03-23 01:46:34.488 3256-3256/com.example.test2 I/ceshi: onStop-fragment-1
03-23 01:46:34.488 3256-3256/com.example.test2 I/ceshi: onDestroyView-fragment-1
03-23 01:46:34.488 3256-3256/com.example.test2 I/ceshi: onCreateView-fragment-2
03-23 01:46:34.488 3256-3256/com.example.test2 I/ceshi: onActivityCreated-fragment-2
03-23 01:46:34.489 3256-3256/com.example.test2 I/ceshi: onStart-fragment-2
03-23 01:46:34.489 3256-3256/com.example.test2 I/ceshi: onResume-fragment-2


同样只是销毁了view,fragment本身没销毁.


三 分析总结:

1 fragmeng 的生命周期可以分3中状况:

1.1  到onstop 

1.2  到ondestoryview

1.3  到ondetch

2 回退键在有栈操作的时候是不一样的,此时更像是取消上一次的操作,也就是弹栈


可以参考:

Android的任务和回退栈 

http://blog.csdn.net/oracleot/article/details/19036909


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值