最常用的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
            // 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

你可能感兴趣的:(最常用的Activity的onBackPressed()与finish()的区别.)