Jetpack
Jetpack 是 Google 推出的一个框架,主要是可以对代码的逻辑和 UI 界面实现深层的解耦,打造数据驱动型的 UI 界面。Android Architecture 组件是 Android Jetpack 的一部分,包含以下组件等:
- Lifecycle:能够处理 Activity 和 Fragment 的生命周期,在 AndroidX 中,Fragment 和 Activity 已经对 Lifecycle 提供了默认的支持。
- ViewModel:当做 MVVM 的 ViewModel 层,并具有生命周期意识的处理和 UI 相关的数据。
- LiveData:和 RxJava 的作用是一样的,对数据进行监听,优点是无需处理生命周期、无内存泄漏等。
- Paging:是一个易于使用的数据分页库,支持 RecyclerView。
- Room:强大的 ORM 数据库框架。
- Navigation:一个用于管理 Fragment 切换的工具类,可视化、可绑定控件、支持动画等优点。
- WorkManager:灵活、简单、延迟和保证执行的后台任务处理库。
- StartUp:一个和启动有关的库。
- DataBinding:加速 MVVM 的创建。
使用 Android Jetpack 组件具有以下优势:
- 轻松管理应用程序的生命周期
- 构建可观察的数据对象,以便在基础数据库更改时通知视图
- 存储在应用程序轮换中未销毁的 UI 相关数据,在界面重建后恢复数据
- 轻松地实现 SQLite 数据库
- 系统自动调度后台任务的执行,优化使用性能
- 支持 RxJava:由于 RxJava 强大的生态环境,几乎和数据相关的组件都对 RxJava 提供了支持。
- 减少代码量:以 Data Binding + ViewModel + LiveData 或者 RxJava 构建的 MVVM 模式能够显著地减少代码量,比平时用的 MVP 模式也会更加方便,无需主动更新 UI。
上述组件的架构功能如下:
- Activity 和 Fragment 负责产品与用户的交互
- ViewModel 作为数据的存储和驱动
- Resposity 负责调度数据的获取
- Room 储存本地序列化的数据
- Retrofit 获取远程数据的数据
Navigation
Navigation 是一个可以简化 Android 导航的库和插件。它可以用来管理 Fragment 的切换。
- 处理 Fragment 的切换
- 默认情况下正确处理 Fragment 的前进和后退
- 为过渡动画提供标准化的资源
- 可以用来绑定 Toolbar、BottomNavigationView 以及 ActionBar 等
- 支持 ViewModel
Navigation 有重要的三要素:
- Navigation Graph:这是一个新的资源文件,用户可以在可视化界面中看到具体的屏幕界面和跳转流程的关系
- NavHostFragment:是当前 Fragment 的容器
- NavController:导航的控制者
Data Binding
Data Binding 和 MVVM 其实是两个不同的概念,MVVM 是一种架构模式,而 Data Binding 是一个实现数据和 UI 绑定的框架,即 Data Binding 是构建 MVVM 模式的一个工具。
Lifecycle
Lifecycle 是一个生命周期的感知组件,执行操作以响应另一个组件(例如 Activity 和 Fragment)的生命周期状态的更改,可以监听 Activity 组件生命周期的变化,在每个生命周期执行相应的方法。
不同于以往会在生命周期中执行相应的方法时,需要设置接口,然后在生命周期中回调接口,这样会造成代码的耦合,也会引发生命周期的问题。Lifecycle 的优点是实现了执行的逻辑和活动的分离,代码解耦并且增加了代码的可读性。Lifecycle 在活动结束时会自定义移除监听。
LiveData
一个应用肯定要进行数据的更新。当用户执行某种操作或者服务器端的数据发生改变后,都需要重新获取数据,再次刷新界面的 UI。那么,每改变一次就需要重复一次,如何使用一个方式可以监听数据状态,在数据变化时就自动更新 UI 呢?LiveData 就是用来实现此功能的,它解决了数据展示和刷新的问题:只需要创建 LiveData 实例后,为可观察的数据添加观察者,在数据改变时会自动回调观察者。
ViewModel
用户在使用应用的过程中,可能随时会被中断或者界面发生了重建,如果重新进入后数据丢失了就会造成不好的用户体验。我们可以使用onSaveInstanceState()
方法来保存数据,然后在界面重建后使用onRestoreInstanceState()
方法来恢复数据。这种方式虽然可以解决问题,但是如果过于频繁,在每个界面都要编写重建和恢复的代码,就会造成十分繁琐,且数据量过大时会影响执行性能。ViewModel 就是来解决这个问题的。
ViewModel 会在活动重建时仍然保存数据,在活动创建完成后从中获取数据。
ViewModel 的优点:
- 数据和界面的分离,使数据驱动界面
- 解决了运行中断和界面重建时的数据保存问题
- 配合 LiveData 实时地获取最新的数据
- 实现了 Activity 和 Fragment 之间的数据交互
ViewModel 的原理:将数据保存到 ViewModel 中,然后为活动中添加一个 HolderFragment,HolderFragment 中保存了 ViewStore 的实例,ViewStore 中使用 Map 保存了 ViewModel,从而在活动重新创建时获取到原来的 ViewModel。
一般 ViewModel 会和 LiveData 组合,保存可观察的数据
在研究生毕业设计的项目中,我在安卓端的代码中就使用到了 LiveData 搭配 ViewModel 的组合。
在ContractViewModel
类中的代码如下。这里主要是使用到了一个MutableLiveData
的类。
1 | public class ContractViewModel extends ViewModel { |
然后,在 Fragment 中这样使用:
1 | private ContractViewModel mViewModel; |
从上面可以看出,mViewModel
可以通过ViewModelProviders
与fragmentActivity
,再与ContractViewModel
绑定。mViewModel.getContractModel().observe()
的方式。除此之外,可以使用postValue()
的方式去传递值。
Room
在此之前,在 Android 通常是使用第三方的优秀 ORM 数据库框架,例如 GreenDao 等,但是现在,谷歌官方已经推出了 Room 这个强大的 SQLite 数据库框架。
- 与 SQL 语句接近
- 支持 RxJava2,支持 LiveData
Paging
当使用到 RecyclerView 进行大量的数据展示时,列表通常需要进行分页的操作。Paging 就是 Jetpack 中的分页库。
而实际上,分页的解决方法有很多种,为什么我们需要使用 Paging 呢?
- 支持 RxJava2、LiveData、Room 等
- 可以自定义分页策略
- 可以异步处理数据
WorkManager
WorkManger 是一个可兼容、灵活和简单的延迟后台任务。而Android 中处理后台任务的选择有很多种,比如 Service 等等,那么为什么选择使用 WorkManager 呢?
- 可以指定约束条件,比如必须在有网络的条件下执行
- 可以定时执行或者单次执行
- 监听和管理任务状态
- 多个任务可以使用任务链的方式
StartUp
StartUp 是一个和启动有关的库。在之前的开发中,许多第三方的库需要在 Application 中进行初始化,即进入 Activity 之前就要初始化完成。常用的初始化的方式有两种:
- 自定义 Application,然后在
onCreate()
方法中进行初始化。 - 自定义 ContentProvider,在
onCreate()
方法中进行初始化。
StartUp 库采用的是上面的第二种方式。