【Jetpack】学穿:ViewBinding → 视图绑定(上)

简介: 手机厂商还没卷完Android 12,Android 13 就悄然声息地来了,距离Google 2008年9月22日发布Android 1.0,已过去13个年头。

0x0、Jetpack简介


手机厂商还没卷完Android 12,Android 13 就悄然声息地来了,距离Google 2008年9月22日发布Android 1.0,已过去13个年头。


历经13年的打磨和沉淀,Android体系与社区生态已非常成熟,开发者从最初的框架少、没规范、代码都得自己写,到轮子、框架满天飞。得益于此,我们少做了很多脏活累活(基础代码),把更多的时间花在业务逻辑上,达成快速迭代的目的。


但琳琅满目的技术选型,也让开发者无从选择,以致于做出的应用良莠不齐,Android官方一直没推出开发标准。而一些技术社区出于更高效地进行协同开发,逐渐引入了MVP、MVVM等应用开发架构。使用这些架构开发出的应用,从项目质量、代码可读性与可维护性来说,都更加出色,所以这些框架和技术逐渐流行起来。


Google一直致力于Android生态环境的搭建,为了解决开发碎片化,方便广大开发者,在2018年的 Google I/O大会上推出了 全新的Android Jetpack应用开发架构。它是一套 库、工具和指南的集合,称作 Jetpack开发工具集 可能更贴切。


Android Jetpack 向后兼容,是为现代设计实践而设计的,如关注点分离、测试能力、松散耦合、观察者模式、控制翻转、Kotlin集成等生产力特性。旨在让开发者用更少的代码,更易构建出健壮、高质量的应用程序。


网上盛传的一张将Jetpack组件分为四大类的老图:


网络异常,图片无法展示
|


图片来源:Use Android Jetpack to Accelerate Your App Development,简单介绍下~


Architecture → 架构


帮助开发者设计稳健、可测试、易维护的应用。


  • Data Binding数据绑定,可使用 声明式 将布局中的界面组件绑定到应用中的数据源;
  • Lifecycles生命周期感知,可感知和响应Activity和Fragment的生命周期状态的变化;
  • LiveData可观察的数据持有者类,与常规Observable不同,它是具有生命周期感知的;
  • Navigation应用内导航,Fragment的管理框架,或者说路由;
  • Paging列表分页,可以轻松实现分页预加载以达到无限滑动的效果;
  • Room轻量级ORM数据库,本质上是一个SQLite抽象层,注解 + 编译时自动生成功能类;
  • ViewModel数据存储组件,具备生命周期感知能力;
  • WorkManager托管延时任务,即使APP被杀、或设备重启,只要TaskRecord还存在最近访问列表中,都会执行;


Foundation → 基础


提供横向功能,如:向后兼容、测试、安全、Kotlin语言支持;


  • AppCompat → 帮助较低版本的Android系统进行兼容;
  • Android KTX → 基于Kotlin特性为Android、Jetpack提供一些简易易用的扩展;
  • Multidex → 为具有多个Dex文件应用提供支持;
  • Test → 用于单元和运行时界面测试的 Android 测试框架;
  • Benchmark(性能检测)、Security(安全)等;


UI → 界面


  • Animation & Transition → 内置动画及自定义动画效果;
  • Emoji → 即便用户没有更新Android系统也可以获取最新的表情符号;
  • Auto(车)、TV、WearOS;
  • Fragment → 组件化界面的基本单位;
  • Layout → 用XML中声明UI元素或者在代码中实例化UI元素;
  • Paletee → 从调色板中提取出有用的信息;


Behavior → 行为


  • Download Manager → 处理长时间运行的HTTP下载、超时重连的系统服务;
  • Media & Playback → 用于媒体播放和路由(包括 Google Cast)的向后兼容 API;
  • Permissions → 用于检查和请求应用权限的兼容性API;
  • Notifications → 提供向后兼容的通知API,支持Wear和Auto;
  • Sharing → 提供适合应用操作栏的共享操作;
  • Slices → 一种UI模板,创建可在营养外部显示应用数据的灵活界面元素;


咳咳,Android官网已经找不到上面这个图了,猜测官方旨在强化 Architecture架构组件,其他三个只是对已有内容的收集整理。实际开发中,也是这部分的组件用得多一些,Jetpack库可单独使用,也可以组合使用,开发者可按需选择。对此,官方还进行了更细致的分类,具体可见:《按类型探索Jetpack库》


关于Jetpack的简介就到这里,在选型时弄清楚组件的 存在缘由、责任边界,就能有的放矢。本节开始折腾,先带来一个超简单的 → ViewBinding(视图绑定)


0x2、从 手写findViewById 到 ViewBinding


从早期对照XML手写findViewById,到在线工具自动生成:


网络异常,图片无法展示
|


到AS插件自动生成:


网络异常,图片无法展示
|


再到View注入框架 → ButterKnife(黄油刀)


网络异常,图片无法展示
|


后面Kotlin普及,带来了扩展创建 kotlin-android-extensions(KAE)直接拿id当控件用,原理:


类中定义一个存储控件引用的HashMap,id为key,控件实例为value,当用到控件时,先查HashMap中该id对应的实例是否缓存,是返回,否findViewById获取实例存到HashMap中,同时把找到的实例返回。


粗暴的 空间换时间,方便是挺方便的,但也存在下述问题:


网络异常,图片无法展示
|


好景不长,Kotlin 1.4.20-M2中,JetBrains废弃了KAE,转而建议我们使用 ViewBinding


相关文章
|
Android开发 Windows 容器
浅析 JetPack Compose 是如何安装到View视图上
为什么 Compose 无需在意 view 层级问题,怎样嵌套都行? (最简单10s就能明白);
207 0
浅析 JetPack Compose 是如何安装到View视图上
|
XML Java API
Jetpack 系列(6)—— ViewBinding 与 Kotlin 委托双剑合璧
Jetpack 系列(6)—— ViewBinding 与 Kotlin 委托双剑合璧
186 0
Jetpack 系列(6)—— ViewBinding 与 Kotlin 委托双剑合璧
|
API Android开发 Kotlin
【Jetpack】学穿:Activity Results API(下)
【Jetpack】学穿:Activity Results API
305 0
|
API 开发者
【Jetpack】学穿:Activity Results API(中)
【Jetpack】学穿:Activity Results API
190 0
|
API 开发者
【Jetpack】学穿:Activity Results API(上)
【Jetpack】学穿:Activity Results API
171 0
|
存储 缓存 数据管理
【Jetpack】学穿:ViewModel → 视图模型(下)
本节带来组件 → ViewModel 视图模型的解读!叫 视图数据 可能更贴切,有人也叫 视图状态
234 0
|
XML 数据格式 Python
【Jetpack】学穿:ViewModel → 视图模型(中)
本节带来组件 → ViewModel 视图模型的解读!叫 视图数据 可能更贴切,有人也叫 视图状态
138 0
|
存储 编解码 数据管理
【Jetpack】学穿:ViewModel → 视图模型(上)
本节带来组件 → ViewModel 视图模型的解读!叫 视图数据 可能更贴切,有人也叫 视图状态
164 0
|
缓存 Java 编译器
【Jetpack】学穿:LiveData → ???(下)
在开始这篇文章前,我就遇到了第一个关于LiveData的问题:该怎么翻译这个词呢?
266 0
【Jetpack】学穿:LiveData → ???(中)
在开始这篇文章前,我就遇到了第一个关于LiveData的问题:该怎么翻译这个词呢?
140 0