先看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
// the platform where it doesn't exist.
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();