首先在target29之前,我们要对用户返回的操作进行监听,一般是这样的
override fun
onBackPressed() {
// and so on..
}
// 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(); } }