0%

Android Jetpack 组件

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。

Android JetPack 组件Android JetPack 组件

上述组件的架构功能如下:

  • Activity 和 Fragment 负责产品与用户的交互
  • ViewModel 作为数据的存储和驱动
  • Resposity 负责调度数据的获取
  • Room 储存本地序列化的数据
  • Retrofit 获取远程数据的数据

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ContractViewModel extends ViewModel {
private MutableLiveData contractModel = new MutableLiveData();
private MutableLiveData callContractResult = new MutableLiveData();
private MutableLiveData proofPlace = new MutableLiveData();

public MutableLiveData<ContractModel> getContractModel() {
return contractModel;
}

public MutableLiveData<Boolean> getCallContractResult() {
return callContractResult;
}

public MutableLiveData<String> getProofPlace() {
return proofPlace;
}
}

然后,在 Fragment 中这样使用:

1
2
3
4
5
6
7
8
9
10
11
private ContractViewModel mViewModel;

mViewModel = ViewModelProviders.of(fragmentActivity).get(ContractViewModel.class);

mViewModel = mViewModel.getContractModel().observe(this, o -> {
CertificateModel certificateModel = (CertificateModel) o;
// TODO
});

mViewModel.getCallContractResult().postValue(XXX);
mViewModel.getProofPlace().postValue(XXX);

从上面可以看出,mViewModel可以通过ViewModelProvidersfragmentActivity,再与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 之前就要初始化完成。常用的初始化的方式有两种:

  1. 自定义 Application,然后在onCreate()方法中进行初始化。
  2. 自定义 ContentProvider,在onCreate()方法中进行初始化。

StartUp 库采用的是上面的第二种方式。