最经常使用的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
相关文章
相关标签/搜索