先看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