先看onBackPressed():
// 代码源于v4-24.1.1 //这个是FragmentActivity里面的代码 public void onBackPressed() { //很明显,判断Fragment栈里面有没有回退. //如果Fragment回退栈有还有Fragment //则回退一次Fragment,没有才调用onBackPressedNotHandled(); if (!mFragments.getSupportFragmentManager().popBackStackImmediate()) { onBackPressedNotHandled(); } }-----------------------------------分割线------------------------------------------ // 这个是BaseFragmentActivityEclair里面的代码 @Override void onBackPressedNotHandled() { //因为新的FragmentActivity是重写的 onBackPressed() 方法 //所以在这里调用父类Activity的onBackPressed(); super.onBackPressed(); } -----------------------------------分割线------------------------------------------ //最终走到的Activity里面的代码 public void onBackPressed() { //这是判断ActionBar有没有什么弹出吧. if (mActionBar != null && mActionBar.collapseActionView()) { return; } //再次判断有没有回退,其实这个判断对于继承FrgamentActivity的来说是没意义的, //对于继承Activity的来说是有意义的 if (!mFragments.getFragmentManager().popBackStackImmediate()) { finishAfterTransition(); } } //如果没有回退了,调用 public void finishAfterTransition() { //这里是判断有没有设置回退动画啥的以及退出Activity的处理. //代码很多,不管这个判断是true还是false,最终都会调用finish(); if (!mActivityTransitionState.startExitBackTransition(this)) { finish(); } }复制代码
版本不同的sdk,可能会有出入
//FragmentActivity的onKeyDown() @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (android.os.Build.VERSION.SDK_INT < 5 /* ECLAIR */ && keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // Take care of calling this method on earlier versions of onBackPressed(); return true; } return super.onKeyDown(keyCode, event); } //Activity的onKeyDown() public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.ECLAIR) { event.startTracking(); } else { onBackPressed(); } return true; } .....其他代码省略}查看Activity的onKeyDown()的源码,可以发现,按返回键是默认调用的onBackPressed();复制代码
总结
如果使用onBackgress(),假如你的Activity有添加管理frgament回退的话,调用该方法是不会退出Activity的.直到Fragment回退栈清空,才会退出Activity.
如果使用finish(),那么就会直接退出Activity