首先在target29之前,我们要对用户返回的操作进行监听,一般是这样的
然后在里面做自己的相关逻辑,但是升级 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();
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-3000372/ ,如需转载,请注明出处,否则将追究法律责任。