首页 > 其他分享 >糟糕的设计,这个 API 在 13 岁时被废弃了

糟糕的设计,这个 API 在 13 岁时被废弃了

时间:2024-01-08 10:36:31浏览次数:27  
标签:返回 13 hi API 开发者 Android 废弃

hi 大家好,我是 DHL。就职于美团、快手、小米。公众号:ByteCode,专注有用、有趣的硬核原创内容,Kotlin、性能优化、系统源码、图解算法、大厂面经。

每个 Android 开发者,每年都要面对 Android API 革命性的改变,动不动就废弃一个 API,然而新的 API 比旧的 API 更加糟糕。给开发者增加了很多负担,每次的适配都是一堆体力活,这样就导致了每个 App 对 SDK 的版本产生了强烈的依赖。轻则功能无法使用,重则直接崩溃。

在之前的文章中 使用 14 年的 API 被下线了 介绍了 Android 团队一个糟糕的设计,废弃了方法 overridePendingTransition(),然后新的 API 比旧的 API 更加糟糕,如下图所示。

糟糕的设计,这个 API 在 13 岁时被废弃了_Android Jetpack

新的 API 增加了一个参数 overrideType,虽然增加了一个参数,但是这个理解成本比较高,开发者需要思考在什么场景下传什么参数,给开发者增加了很多负担。更多内容可以前往查看 使用14年的API被下线了。

今天这篇文章,想介绍 Android 团队废弃的另外一个 API,这个决定让很多开发者感到失望,迫使全球每个 Android 开发者不得不做出改变,去兼容 Android 团队实现的某个功能。

这个 API onBackPressed 我相信每个 Android 同学都用过,它的作用就是监听设备上的返回事件,现如今这个 API 已经陪伴了我们 14 年,在它 13 岁时 (Android 13 (API level 33)) 被废弃了,而且是毫无征兆的废弃,没有过渡期,直接不能正常工作了。

之所以废弃,是因为在 Android 13 上,新增了一个可预测性返回手势的功能,按照官方的解释,用户触发了返回手势,在返回之前,可以提前看到返回之后的结果,这样用户可以决定继续返回,还是停留在当前页面,效果如下图所示。

糟糕的设计,这个 API 在 13 岁时被废弃了_API_02

那为什么不能使用之前的 API 来实现这个功能呢,具体的原因 Android 团队未给出,但是我猜想,使用新的 API 是为了减少不可预知问题的出现,毕竟这个 API onBackPressed() 用了十几年,因此采用了一个低成本的方式,废弃掉原来的 API,使用新的 API 来代替,迫使全球每一个 Android 开发人员去做出改变,兼容 Android 团队实现的这个功能,我们在看一下源码怎么说。

糟糕的设计,这个 API 在 13 岁时被废弃了_Android Jetpack_03

从 Android 13 开始,应该使用 getOnBackInvokedDispatcher() 代替 onBackPressed,如果要向后兼容的话,应该使用 AndroidX 中的 getOnBackPressedDispatcher(),新的 API 除了实现可预测性返回手势的功能之外,还可以拦截返回事件,而原来的方法 onBackPressed() 无法收到返回事件。

Android 13 提供的 API getOnBackInvokedDispatcher() 命名让我无法理解,从一个好名字,改成了一个让人很难理解的名字,并且使用起来也非常的麻烦。

糟糕的设计,这个 API 在 13 岁时被废弃了_sed_04

新的 API getOnBackPressedDispatcher() 需要接受一个 OnBackPressedCallback,而 OnBackPressedCallback 构造方法中需要传入 boolean enabled 的参数。

  • enabled = true 时,表示拦截返回事件,触发设备上的返回键之后,将会回调 handleOnBackPressed 方法
  • enabled = false 时,表示不拦截返回事件,触发设备上的返回键之后 Activity 将直接结束

不过好在提供了 addCallback() 方法,这个方法内部与 LifecycleOwner 做关联,在 Activity 销毁的时候会 remove ,防止内存泄露。

最后我想说的

Android 最令人失望的一点,为了满足 Android 团队实现的某个功能,迫使全球每个 Android 开发者,不得不去做出改变,去兼容他们内部的功能。

而 Android 这些年的变化除了安全问题,其他都是一些无关痛痒的变化,每次的升级都有一堆的 API 被废弃,导致了每个 App 对 SDK 的版本产生了强烈的依赖。轻则功能无法使用,重则直接崩溃。


全文到这里就结束了,感谢你的阅读,坚持原创不易,欢迎、点赞、分享给身边的小伙伴,我会持续分享原创干货!!!


Hi 大家好,我是 DHL,就职于美团、快手、小米。公众号:ByteCode ,分享有用、有趣的硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、动画、大厂面经,真诚推荐你关注我。


我开了一个云同步编译工具(SyncKit),主要用于本地写代码,同步到远程设备,在远程设备上进行编译,最后将编译的结果同步到本地,代码已经上传到 Github,欢迎前往仓库 hi-dhl/SyncKit 查看。



开源新项目

  • 云同步编译工具(SyncKit),本地写代码,远程编译,欢迎前去查看 SyncKit
  • KtKit 小巧而实用,用 Kotlin 语言编写的工具库,欢迎前去查看 KtKit
  • 最全、最新的 AndroidX Jetpack 相关组件的实战项目以及相关组件原理分析文章,正在逐渐增加 Jetpack 新成员,仓库持续更新,欢迎前去查看 AndroidX-Jetpack-Practice
  • LeetCode / 剑指 offer,包含多种解题思路、时间复杂度、空间复杂度分析,在线阅读


标签:返回,13,hi,API,开发者,Android,废弃
From: https://blog.51cto.com/u_13238266/9139669

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (174)-- 算法导论13.3 3题
    三、用go语言,假设图13-5和图13-6中子α、β、γ、δ和ε的黑高都是k。给每张图中的每个结点标上黑高,以验证图中所示的转换能保持性质5。文心一言:在Go语言中,你可以通过以下步骤来为图13-5和图13-6中的每个节点分配黑高,以验证性质5。首先,我们需要定义一个结构体来表示图中的节点,然......
  • Java Steam 常用 API
    微信公众号:运维开发故事作者:wanger现在Java17和Java11基本上可以和Java8平分JDK装机比例。下面是我常用的一些StremAPI操作。除了分组、转换、排序,如果大家还有更多常用的API可以一起留言交流。分组List 默认分组过后是Map<Key,List>List<StreamItem>streamLis......
  • 2023-2024-1 20231305 《计算机基础与程序设计》课程总结
    第1周作业https://www.cnblogs.com/zhen-meng/p/17740268.html第2周作业https://www.cnblogs.com/zhen-meng/p/17750180.html第3周作业https://www.cnblogs.com/zhen-meng/p/17765972.html第4周作业https://www.cnblogs.com/zhen-meng/p/17781309.html第5周作业https://www.cn......
  • 20231320 《计算机基础与程序设计》课程总结
    20231320《计算机基础与程序设计》课程总结每周作业链接汇总第0周:自我介绍第1周:第一周学习总结第2周:第二周学习总结第3周:第三周学习总结第4周:第四周学习总结第5周:第五周学习总结第6周:第六周学习总结第7周:第七周学习总结第8周:第八周学习总结第9周:第......
  • 【flink番外篇】9、Flink Table API 支持的操作示例(3)- 通过API查询表和使用窗口函数的
    Flink系列文章一、Flink专栏Flink专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink部署系列本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列本部分介绍Flink的基础部分,比如术语、架构、编程模型、编程指南、基本的datastreamapi用法、四大基......
  • 简洁、轻量级的 Go API 框架
    本次分享的框架是「gin-api-mono」介绍gin-api-mono前先了解go-gin-apigo-gin-api这是一个基于Gin的API框架,它提供了WEB界面一键安装的方式,让你可以快速启动一个开箱即用的Go项目。无论你是否有项目经验,这个框架都适合作为练手项目使用(新手入门必备)。该框架采用了......
  • 文心一言 VS 讯飞星火 VS chatgpt (173)-- 算法导论13.3 2题
    二、用go语言,将关键字41、38、31、12、19、8连续地插入一棵初始为空的红黑树之后,试画出该结果树。文心一言:首先,我们需要了解红黑树的性质。红黑树是一种自平衡二叉查找树,其中每个节点要么是红色,要么是黑色,且满足以下性质:每个节点要么是红色,要么是黑色。根节点是黑色。所有叶子节......
  • js和python的接口api怎么开发
    在JavaScript(JS)和Python之间开发接口(API)时,可以使用多种方法,具体取决于你的需求和偏好。以下是一些常见的方法:RESTfulAPI:RESTful(RepresentationalStateTransfer)是一种设计风格,通过HTTP协议进行通信。你可以使用Node.js(JavaScript)和Flask/Django(Python)等框架来实现RESTfulAPI。在......
  • AP2813 双路降压恒流驱动 一路内置1A一路外置3A LED储能指示灯线路
    产品描述     AP2813是一款双路降压恒流驱动器,高效率、简单、内置功率管,适用于5-80V输入的高精度降压LED恒流驱动芯片。内置功率管输出功率可达12W,电流1.2A。AP2813一路直亮,另外一路通过MODE1切换全亮,爆闪。AP2813工作频率固定在150KHZ左右,同时内置抖频......
  • D13005M-ASEMI高频电源开关D13005M
    编辑:llD13005M-ASEMI高频电源开关D13005M型号:D13005M品牌:ASEMI集电极电流:4A集电极电压:700V集电极-发射极电压:450V发射极-基极电压:12V集电极电流(脉冲):8A芯片个数:1封装:TO-220F工作温度:-50°C~150°C引脚数量:3集电极损耗:70W类型:插件塑封二极管、高压、高速D13005M描述:D13005M拥有广泛的......