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
。