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): onPause11-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