Android API33中onBackPressed()废弃后的替代实现方案
针对targetSdk 33下onBackPressed废弃的适配,最稳妥的方案是使用AndroidX封装的OnBackPressedCallback,可自动兼容全系统版本,无需手动做API版本判断,能完全对齐原有业务逻辑。
前置依赖
先确认当前项目使用的androidx.activity依赖版本不低于1.6.0,这是支持新版返回逻辑的最低稳定版本。
实现代码
不需要重写已废弃的onBackPressed()方法,直接在Activity的onCreate生命周期中注册返回事件回调即可,逻辑和原有实现完全一致:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 其余原有初始化逻辑 // 注册返回事件回调,构造参数传入true代表回调默认启用 onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { if (isTaskRoot) { // 当前为栈根Activity(推送拉起场景),跳转Dashboard页 startActivity(Intent(this@替换为当前Activity的类名, Dashboard::class.java)) finish() } else { // 普通场景正常结束页面返回 finishWithResultOK() } } }) }
注意事项
- 回调构造函数传入的
enabled参数支持动态修改,如果页面中有Fragment、弹窗等组件需要临时拦截返回事件,可以在对应时机将回调的isEnabled设为false,拦截结束后再改回true,耦合度远低于原来重写onBackPressed的实现方式 - 注册回调后不要同时重写旧的
onBackPressed()方法,否则会出现返回事件重复消费、分发顺序异常的问题 - 如果需要开启API33+的预测性返回手势动画支持,只需在AndroidManifest.xml的application节点下添加
android:enableOnBackInvokedCallback="true"属性即可,无需修改上述业务逻辑 - 不推荐直接使用系统原生的
OnBackInvokedCallback,该API仅在API33及以上版本存在,需要自行编写大量版本判断逻辑兼容低版本,维护成本更高。
废弃提示示例

内容的提问来源于stack exchange,提问作者Rumit Patel
相关产品推荐
相关产品推荐

