最經常使用的Activity的onBackPressed()與finish()的區別

先看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,可能會有出入. --------------------------------------------分割--------------------------------------------android

//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(); 複製代碼

總結

若是使用onBackPressed(),假如你的Activity有添加管理fragment回退的話,調用該方法是不會退出Activity的.直到Fragment回退棧清空,纔會退出Activity.
若是使用finish(),那麼就會直接退出Activity
相關文章
相關標籤/搜索