适配target30返回监听以及简单分析finish()和onBackPressed()的区别

首先在target29之前,我们要对用户返回的操作进行监听,一般是这样的

override fun onBackPressed() {
    // and so on..
}

然后在里面做自己的相关逻辑,但是升级 target之后,这一套操作就无效了

解决方案是,如果只需要调用backPresed(),可以使用onBackPressedDispatcher.onBackPressed()替代

如果需要监听返回,那么就可以这样做

private val onBackPressedCallback: OnBackPressedCallback = object : OnBackPressedCallback(true) {
    override fun handleOnBackPressed() {
        backPressed()
    }
}
override fun initEvent() {
    onBackPressedDispatcher.addCallback(this, onBackPressedCallback)
}


其中 backPressed方法是自己定义的,我们可以在里面做自己想要做的操作,适配就到此结束了


然后我突然在想,onBackPressed和finish好像都是退出页面,为什么有些地方退出会用到onBackPressed呢,查了下资料发现,还是有区别的

  • finish(),会直接关闭当前Activity

  • onBackPressed(),是系统返回的操作

听起来可能没什么区别,举个例子就很清晰了,当我们页面有popupWindow被唤醒时,调用onBackPressed会将popupWindow销毁,而调用finish会直接退出Activity

如果页面没有什么东西可以后退时,两者是一样的,这一点从源码来看也很清楚

private void finish(int finishTask) {
        if (mParent == null) {
            int resultCode;
            Intent resultData;
            synchronized (this) {
                resultCode = mResultCode;
                resultData = mResultData;
            }
            if (false) Log.v(TAG, "Finishing self: token=" + mToken);
            try {
                if (resultData != null) {
                    resultData.prepareToLeaveProcess(this);
                }
                if (ActivityManagerNative.getDefault()
                        .finishActivity(mToken, resultCode, resultData, finishTask)) {
                    mFinished = true;
                }
            } catch (RemoteException e) {
                // Empty
            }
        } else {
            mParent.finishFromChild(this);
        }
    }

(finish())

而onBackPressed里面会先判断是否有弹窗、菜单

public void onBackPressed() {
        if (mActionBar != null && mActionBar.collapseActionView()) {
            return;
        }
 
        if (!mFragments.getFragmentManager().popBackStackImmediate()) {
            finishAfterTransition();
        }
    }

当然,走到最后,还是走到finish的逻辑

public void finishAfterTransition() {
        if (!mActivityTransitionState.startExitBackTransition(this)) {
            finish();
        }
    }


请使用浏览器的分享功能分享到微信等