【Android归纳】Fragment生命周期-基于实验的最新总结

现在很多应用的开发都是基于FragmentActivity中嵌套Fragment进行开发的,所以,如果我们能够清晰地知道他们的生命周期,那么会使我们的开发变的容易。

对于Activity的生命周期,我在之前的文章 Activity生命周期-基于实验的最新总结  中已经说的很详细了,因此本篇文章只是从实践角度来讲一下Fragment的生命周期以及Fragment与Activity生命周期的对应关系,像大多数介绍Fragment生命周期的文章一样,先上两张图:




好,言归正传

这里从实例的角度来说明一下Activity与Fragment生命周期的关系

假设我们的Activity为MainActivity,在Activity中有两个Fragment:一个叫做HomeFragment(默认打开的页面),一个叫做UserInfoFragment

现在通过场景模拟的方式来看一下他们的关系

场景1首次启动应用,而Activity默认打开的页面为HomeFragment


场景2关闭电源键(屏幕灭掉)


场景3 屏幕解锁


场景4 第一次切换到UserInfoFragment


场景5 HomeFragment与UserInfoFragment来回切换

若添加Fragment的方法如下:

	private void showFragment(String tag) {
		FragmentManager fm = getSupportFragmentManager();
		FragmentTransaction ft = fm.beginTransaction();
		if (!TextUtils.isEmpty(curFragmentTag)) {
			Fragment f = fm.findFragmentByTag(curFragmentTag);
			if (f != null) {
				ft.hide(f);
			}
		}
		Fragment fragment = fm.findFragmentByTag(tag);
		if (fragment == null) {
			ft.add(R.id.main_layout, getFragmentInstance(tag), tag);
		} else {
			ft.show(fragment);
		}
		ft.commit();
		curFragmentTag = tag;
	}

则:


若将添加fragment的方法从add变成replace,则每次切换都会:(假设从HomeFragment切换到UserInfoFragment)



其实,这里就引出了一个问题:

如果使用replace的话,每次切换的时候,Fragment都会被重新实例化,重新加载一遍数据,这样会非常消耗性能和用户的数据流量,replace一般是在上一个Fragment不再

使用的情况下采用。如果我们不想反复实例化Fragment,则可以使用add方法,切换时hide当前的Fragment,然后再add另一个Fragment,再次切换的时候,只需要hide当前的Fragment,然后show另一个。


场景6 按home键回到桌面(假设当前切换到HomeFragment)


场景7 从桌面返回到应用


其实发现流程跟关闭打开电源键一样

场景8 退出应用(前提是HomeFragment和UserInfoFragment的实例都已经创建,而且是采用add方法添加)



总结:

管理fragment的生命周期有些像管理activity的生命周期。Fragment可以生存在三种状态:

Resumed:

Fragment在一个运行中的activity中并且可见。

Paused:

另一个activity处于最顶层,但是fragment所在的activity并没有被完全覆盖(顶层的activity是半透明的或不占据整个屏幕)。

Stoped:

Fragment不可见。可能是它所在的activity处于stoped状态或是fragment被删除并添加到后退栈中了。此状态的fragment仍然存在于内存中。

同样类似于activity,你可以把fragment的状态保存在一个Bundle中,在activityrecreated时就需用到这个东西。你可以在onSaveInstanceState()方法中保存状态并在onCreate()onCreateView()onActivityCreated()中恢复。

FragmentActivity的生命周期中最大的不同就是存储到后退栈中的过程。Activity是在停止时自动被系统压入停止栈,并且这个栈是被系统管理的;而fragment是被压入activity所管理的一个后退栈,并且只有你在删除fragment后并明确调用addToBackStack()方法时才被压入。

然而,管理fragment的生命周期与管理activity的生命周期极其相似。你所需要去思考的是activity的生命周期如何影响fragment的生命周期。

相关链接:

Activity的四种启动模式-图文并茂

Activity生命周期-基于实验的最新总结

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值