最經常使用的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,可能會有出入


//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
相關文章
相關標籤/搜索