架构组件(Android Architecture Components)是 2017 Google IO 上发布的关于安卓开发的一个重量级框架。算是安卓开发框架的一个官方参考实现。现在该框架还处于 alpha1 版本,估计会在 Android O 正式发布的时候一起发布。
架构组件是多个小库组成的。你可以只使用其中的一部分也可以使用所有的库,目前由下面几个库共同组成安卓架构组件库:
android.arch.core:core 包含一个自定义的 Function 接口和几个内部用到的类
android.arch.core:core-testing 用于测试的一个核心类, 依赖于上面的 core 库
android.arch.lifecycle:common 生命周期库的通用接口,里面定义了几个管理生命周期的一些接口,有 Lifecycle、LifecycleObserver、LifecycleOwner、OnLifecycleEvent、ViewModel、ViewModelProvider、ViewModelStore、ViewModelStoreOwner 等类和接口。
android.arch.lifecycle:runtime 库定义了几个生命周期相关的运行时接口,这个库依赖 android.arch.core:core 和 android.arch.lifecycle:common 库。里面有LifecycleRegistry、ProcessLifecycleOwner、ServiceLifecycleDispatcher、LifecycleActivity、LifecycleFragment、LifecycleService 等接口。值得注意的是, LifecycleActivity 是继承至 android.support.v4.app.FragmentActivity 的,而 LifecycleFragment 是继承至 android.support.v4.app.Fragment 的,当 android.arch.lifecycle 正式发布的时候,这两个类将被删除,Support v4 中的 FragmentActivity 和 Fragment 将直接实现 LifecycleRegistryOwner 接口。也就是说,当安卓架构组件正式发布的时候, 新版本的 Support v4库将依赖架构库并提供基本的实现。如果你不使用安卓架构组件的话,对你的影响也不大,只是添加了几个接口和十几个函数而已。
android.arch.lifecycle:extensions, 这个库依赖前面的 runtime 库,里面是扩展生命周期功能的几个接口定义和实现,主要有 AndroidViewModel 接口,里面可以访问 Application context 对象;LiveData 的类,用户在生命周期中保存数据的;Transformations 助手类实现简单的数据处理操作,类似 RxJava 中的操作符;ViewModelProviders 提供了对 ViewModel 的创建和管理。
android.arch.lifecycle:compiler 这个是用来生成代码的库,需要使用 annotationProcessor “android.arch.lifecycle:compiler:1.0.0-alpha1” 的方式来引用,自动生成一些代码避免使用反射来提高性能。
android.arch.persistence.room 是数据库 ORM 框架,里面包含了 common、runtime、migration、support-db、support-db-impl、compiler 等子库。如果你的应用中不使用 Sqlite 则无需使用 room 框架。
从上面的库分布可以看到,安卓框架组件的主要功能有两个:管理生命周期和数据库 ORM 。
生命周期
生命周期是 Android 应用中的特点,Android 系统四大组件都有不同的生命周期,系统会在不同的时候调用这些生命周期回调接口,你一个应用需要恰当的处理这些生命周期回调接口,否则的话您的应用可能会导致内存泄露或者应用会崩溃。对于 Android 开发新手来说,处理这些生命周期是比较麻烦的,所以 Android 团队希望通过这个 lifecycle 库来帮助开发者正确的处理生命周期。
ViewModel 是干什么的呢?
ViewModel 是生命周期中延伸出来的一个概念,比如 Activity,一般而言我们会把很多代码都放到 Activity 中去,但是 Activity 类是系统调用的,系统会在不同的情况下去调用 Activity 的不同函数,Activity 类只是系统和您的应用的桥梁,所以避免把过多的代码放到 Activity 中去,官方建议只有 处理 UI 事件或者和系统服务交互的代码才能放到 Activity 中。
另外你的 UI 应该有模型(model)来驱动,模型的责任是处理应用的数据,和 View 以及你 App 中的其他组件是独立的,并且模型应该和生命周期分离。这样 UI 代码尽可能的简单并和 App 逻辑代码分离可以很方便的处理生命周期的变化。
所以 ViewModel 的出现是为了简化生命周期处理的,如果你有数据需要在 Activity 中显示,则可以把数据定义到 ViewModel 中,通过 ViewModel 来管理和存储 UI 相关的数据,这样当 Activity 配置改变的时候您的数据依然存在,比如 当屏幕从横屏变为竖屏,你当前 Activity 的数据依然存在。
LiveData 呢?
把数据保存到 ViewModel 中就可以保持数据在配置改变的时候依然存在,但是如果数据发生变化了,我们如何通知 UI 去更新界面呢?如果 数据是来至于其他地方的并且请求数据需要消耗资源,如果确保只有在对用户有意义的生命周期阶段才执行请求数据的操作呢?这个时候就需要 LiveData 了。
LiveData 是用来保存数据的,里面可以保存一个数据对象并且该数据是可以被检测的同时 LiveData 的 Live 说明 LiveData 会自动处理生命周期事件,只有当 Lifecycle 处于 STARTED 或者 RESUMED 状态的时候才认为是活动状态。比如你在请求一个图片,如果用户点击返回键退出了应用,则 LiveData 处于非活动状态,这个时候你就可以取消继续请求图片的操作了。
所以 LiveData 和 ViewModel 是 Lifecycle 的有利补充。
数据持久化
不支持离线的应用不是一个用户体验良好的应用,用户手机网络的变化是不可预知的,特别是现在复杂的社会环境,比如做地铁到地下隧道了,手机没信号了,这个时候你正在浏览微博,看到一个有趣的消息想去点赞,点了一个赞微博应用就在哪里转圈,阻止你去看其他信息。一直等到出隧道恢复信号了才能点赞成功。如果你在隧道的时间比较长,则你一定感觉不爽。 如果应用支持离线使用,点赞的时候,应用把点赞的操作持久化到本地,然后你还可以继续浏览其他本地已经缓存的消息,当手机恢复网络的时候,应用自动把之前的点赞操作同步到服务器,这种体验肯定要好很多。
所以数据持久化是一个比较重要的功能,要保存复杂的数据在 Android 上没有比 Sqlite 更好的方式了。而使用 Sqlite 要求大家了解 Sql 语句并且手写各种创建表和查询表的 Sql 语句,这是比较繁琐的一项任务。而 Java 早在 2001 年就出现 Hibernate 等 ORM 框架了,但是这些 ORM 框架都比较“笨重” 无法在 Android 环境下使用, 近几年也出现了一些 Android 上的 ORM 框架比如 GreenDao、Ormlite 等,而来自官方的 Room 框架风格上有点借鉴 Retrofit 的意思,也算是官方提供的一个 ORM 框架了。
如果你的应用需要保存数据,则可以考虑下 Room 框架。
这次先介绍下架构组件的分类和主要模块,后面分别介绍 Lifecycle、LiveData、ViewModel、和 Room 的具体使用。
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。