Fragment生命周期

本文详细解析了Android中Fragment的生命周期,包括不同场景下(如屏幕锁定、切换Fragment等)的具体行为。同时,深入探讨了Fragment切换的方法及addToBackStack的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,生命周期


场景演示 : 切换到该Fragment(add)

11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume

屏幕灭掉:(跟随activity)

11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop


屏幕解锁(跟随activity)

11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume


切换到其他Fragment:(remove)
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView


切换回本身的Fragment:(从返回栈 回来)

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume

回到桌面(跟随activity)

11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop

回到应用(跟随activity)

11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume


退出应用(跟随activity)

11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy

11-29 14:37:03.165: D/AppListFragment(7649): onDetach


2,fragment切换

Fragment 之间的切换方法:

1,add、remove方法,走生命周期

2,hide、show方法,不走生命周期。hide、show时,会执行onHiddenChanged方法

3,replace其实就是先remove掉之前fragment,再add新的fragment,调用remove方法,声明周期会执行onPause、onStop、onDestoryView、onDestory、onDeatch。fragment彻底销毁。

但是如果把fragment进行入栈操作  transaction.addToBackStack(null),走onDestoryView方法之后不会走onDestory,返回这个页面时(返回键),直接onCreateView,不再onCreate。返回直接调用popBackStack()方法。


3,addToBackStack注释:

如果您向事务添加了多个更改(如又一个 add() 或 remove()),并且调用了 addToBackStack(),则在调用 commit() 前应用的所有更改都将作为

单一事务添加到返回栈,并且返回按钮会将它们一并撤消

也就是说,点击 返回键,返回到commit之前的状态。是一个撤销commit的操作。fragment的生命周期也会变化。例子:


add:

findViewById(R.id.button).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				showFragment();
			}
		});

private void showFragment() {
		
		FragmentManager manager=getSupportFragmentManager();
		FragmentTransaction transaction=manager.beginTransaction();
		firstFragment=(FirstFragment) manager.findFragmentById(R.id.fragment);
		if (firstFragment==null) {
			firstFragment=new FirstFragment();
			transaction.add(R.id.fragment, firstFragment);
		}
		Bundle bundle=new Bundle();
		bundle.putString("argument", "argumentFromFirstActivity");
		firstFragment.setArguments(bundle);
		transaction.addToBackStack(null);//同返回键,撤销上一次提交的事物
		transaction.commit();
	}

点击button,在原来空白的位置出现 firstFragment,并把它加入返回站



点击返回按钮,firstFragment消失,页面回到空白状态


remove:

findViewById(R.id.button02).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				exchangeFragment();
			}

			
		});

	private void exchangeFragment() {
		// TODO Auto-generated method stub
		FragmentManager manager=getSupportFragmentManager();
		FragmentTransaction transaction=manager.beginTransaction();
		transaction.addToBackStack(null);
		transaction.remove(firstFragment);
//		transaction.hide(firstFragment);
		transaction.commit();
	}

点击button,原来的firstFragment消失,压入返回栈,所以没有走onDestroy方法


点击返回键,fistFragment重新出现


总结:

  • 压入返回栈,就是让这个commit的事务 受 返回栈的管理,弹出返回栈的时候 走 生命周期。
  • 以上是add、remove的情况下的addToBackStack。
  • show、add的时候addToBackStack,区别是 不会走生命周期,也会有视图是的变化
  • 如果压入返回栈的commit,没有add、remove、hide、show操作,也会把一个空压入,按返回键弹出一个空(猜测),不走生命周期,视图没有变化。


总结的总结:

无论add、remove、hide、show哪种操作:

  • addToBackStack操作都会把commit压入返回栈。
  • commit的时候有视图的变化,出栈的时候自然也有。反之都没有
  • add、remove走生命周期
  • show、hide不走生命周期


参考 http://www.pocketdigi.com/20141006/1385.html

          https://developer.android.google.cn/guide/components/fragments.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值