Android16升级,预测性返回适配起来到底难不难

背景

上一篇文章说到了要开始做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,让它去做这些事情就好了,我们更多的注意力可以放在后期的自测验证环节上

相关推荐
_李小白1 小时前
【android opencv学习笔记】Day 33: 直线检测之图像轮廓检测
android·opencv·学习
Mars-xq1 小时前
vscode 开发Android
android·ide·vscode
__Witheart__1 小时前
关于 uname 查看的内核版本号的后缀
android·linux·ubuntu·rockchip
QING6181 小时前
Kotlin 协程新手指南 —— 结构化并发
android·kotlin·android jetpack
不会写DN1 小时前
通过php 中的Route:: 的写法了解什么是静态类调用
android·java·php
BreezeDove2 小时前
【Android】AndroidStudio+Flutter开发建议环境变量
android·flutter
UXbot2 小时前
移动端UI设计工具选型指南:iOS与Android设计标准支持对比
android·前端·低代码·ios·交互·团队开发·ui设计
Kapaseker2 小时前
为什么 Java 要废弃 Thread.stop()?看完这篇你就懂了
android·kotlin
苦瓜花2 小时前
【Android】三大动画的实践
android