背景
上一篇文章说到了要开始做targetSdk36的适配工作并且介绍了如何适配自适应布局这个新特性,但除此以外,Android16还有一个新特性也必须值得注意一下,那就是预测性返回,要说这个特性,Android13里面就已经出来了,但是那会还只是存在于开发者选项里面,但是如果当你把targetSdk升级到36后,那么这个预测性返回将会被强制开启,对的,所以我们是时候要知道这个特性里面会有哪些适配点
什么是预测性返回
预测性返回(Predictive Back Gesture)是 Android 系统手势导航的一项增强功能。它允许用户在完成返回滑动操作之前,就能够提前预览即将跳转到的目标界面。例如:
- 在当前应用界面使用返回手势时,可在应用后方提前显示主屏幕的动画预览
- 在 Activity 之间切换时,可预览上一个Activity的界面
- 在任务之间切换时,可预览上一个任务的界面
特性对应用造成的影响
onBackPressed不再被调用:以 Android 16 为目标平台时,系统不再分发onBackPressed回调KeyEvent.KEYCODE_BACK不再分发:系统不再调度返回按键事件- 自定义返回行为失效:依赖上述 API 的自定义返回逻辑将完全不执行
- 预测性返回动画默认启用:
android:enableOnBackInvokedCallback默认为true - 应用内动画缺失:未适配
OnBackInvokedCallback的应用在返回时无法展示预览动画
可以看到影响面还是很大的,就比如很多应用会在返回的时候做一下二次确认,在返回事件那边拦截一下,弹一个框出来,或者更常见的,一些h5页面也会做一些桥接拦截一下返回事件,做一下返回栈的处理,等等这些常见的操作,当升级到targetSdk36后将会变的无效
适配方案
方案一:迁移至受支持的返回导航API
更新依赖

替换 onBackPressed 为 OnBackPressedDispatcher

通过生命周期来驱动回调
在Fragment中,如果要处理返回事件,可以通过监听生命周期的方式

Compose应用中使用PredictiveBackHandler

方案二:临时选择停用预测性返回
预测性返回特性同样也提供了关闭的开关,可以让你的应用就算targetSdk升级至36后,也不会受特性的影响,但是这个肯定不是永久方案,建议还是尽早适配完才好
全局停用

按Activity级别停用

适配总结
综上所述,我们适配预测性返回的时候,主要需要考虑以下几点
-
应用是否拦截返回事件?
- 否:无需适配,预测性返回默认生效
- 是:是否使用 AndroidX API?
- 是:升级到 activity 1.6.0-alpha05+
- 否:迁移到 OnBackPressedDispatcher
-
是否需要预览动画
- 是:实现 OnBackInvokedCallback + 动画进度
- 否:使用 OnBackPressedDispatcher 即可
-
是否为 Compose 应用
- 是:使用 PredictiveBackHandler
-
是否需要临时跳过适配
- 是:设置 enableOnBackInvokedCallback=false
最后
个人感觉,预测性返回相对来讲好适配一些,唯一可能有点麻烦的就是要升级androidx插件版本,对于那些老项目,万年不更新插件库的来讲,可能会多出一些兼容工作,至于其他的就没别的了,它不像16kb或者应用内存限制那种特性,不定性因素比较多,因项目而异,就跟我上面那些适配总结写的一样,预测性返回适配起来有自己的公式,我们直接去套公式就行,或者更加简单粗暴的,直接扔给AI,让它去做这些事情就好了,我们更多的注意力可以放在后期的自测验证环节上