Android開發,分析 finish() 和 onBackPressed() 的區別
阿新 • • 發佈:2018-12-14
Android開發,分析 finish() 和 onBackPressed() 的區別
finish()
,最常用來關閉 Actiivty 的方法。onBackPressed()
,Android 點選返回按鍵的方法。
- 一般來說這兩個方法作用是一致的。
- 但使用
finish()
,將無法實現返回上一層的共享變換,必須使用onBackPressed()
才能實現。
finish()
public void finish() { finish(DONT_FINISH_TASK_WITH_ACTIVITY); }
/** @hide Task isn't finished when activity is finished */
// 關閉 Activity 但不關閉棧
public static final int DONT_FINISH_TASK_WITH_ACTIVITY = 0;
/**
* @hide Task is finished if the finishing activity is the root of the task. To preserve the
* past behavior the task is also removed from recents.
*/
// 如果當前 Activity 處於棧底,則關閉 Activity 同時關閉棧
public static final int FINISH_TASK_WITH_ROOT_ACTIVITY = 1;
/**
* @hide Task is finished along with the finishing activity, but it is not removed from
* recents.
*/
// 關閉 Activity 同時關閉棧
public static final int FINISH_TASK_WITH_ACTIVITY = 2;
方法一共有三種。
onBackPressed()
public void onBackPressed() {
if (mActionBar != null && mActionBar.collapseActionView()) {
return;
}
if (!mFragments.getFragmentManager().popBackStackImmediate()) {
finishAfterTransition();
}
}
onBackPressed()
方法,先判斷是否有彈出的視窗,PopWindow
or Dialog
or NavigationView
…等,如果有先關閉這些,如果沒有再來進行關閉的操作。
finishAfterTransition()
執行變換動畫後再進行 finish()
public void finishAfterTransition() {
if (!mActivityTransitionState.startExitBackTransition(this)) {
finish();
}
}
總結
一共存在以下三種情況:
- 沒有
PopWindow
orDialog
orNavigationView
or 共享變換,finish()
與onBackPressed()
是完全一樣的。 - 存在
PopWindow
orDialog
orNavigationView
,onBackPressed()
會先關閉它。 - 存在共享變換,
finish()
將不執行動畫直接關閉 Activity,onBackPressed()
執行動畫完才關閉 Activity。
參考文獻
Android開發,原始碼分析finish()和onBackPressed()的區別 - Stanny_Bing的部落格 - CSDN部落格