概述jetpack常见组件功能、使用方式。
简介
Jetpack是一套库、工具和指南,可以帮助开发者更轻松地编写优质应用。这些组件可以帮助开发者遵循最佳做法、让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上。jetpack主要包含四个方面:架构,界面,行为,基础。

架构
LifeCycle
- 主要目的
- 系统组件生命周期与UI之间解耦
- 作用范围
- Activity、Fragment、Service、Application
- 原理
- 观察者模式。LifecycleOwner(被观察者),LifecycleObserver(观察者)。LifeCycleOwner通过注解
@OnLifeCyclerEvent通知观察者。
- 观察者模式。LifecycleOwner(被观察者),LifecycleObserver(观察者)。LifeCycleOwner通过注解
- 使用方式
- SupportActivity等系统类已经默认实现了观察者方法,对于使用方来说,需要:
-
- implements LifecycleObserver方法
-
- 通过 @OnLifeCyclerEvent(Lifecycle.Event.ON_***)方法进行监听
-
- 在Activity中获取观察者 getLifecycle() 并进行addObserver绑定
-
- 对应的Activity、Fragment被观察者
LifecycleOwner - 对应的Sevice被观察者
LifecycleService - 对应的Application被观察者
ProcessLifecycleOwner
- SupportActivity等系统类已经默认实现了观察者方法,对于使用方来说,需要:
ViewModel
- 主要目的
- 解耦model与系统组件生命周期。他独立于配置变化,Activity因为翻转屏幕等引起的销毁重建不会影响viewmodel。
- 作用范围
- 数据类,类似于datamanager,脱离UI独立处理数据的逻辑类。
- 原理
- 在Activity中默认实现了
ViewModelStoreOwner接口。在Activity中初始化viewmodel需要传入对应的class类,而ViewModelStoreOwner中持有一个HashMap<viewModel类名,viewModel对象>,会进行统一的clear逻辑。
- 在Activity中默认实现了
- 使用方式
- Activity持有viewModel,对于数据的更新往往联合LiveData一起使用。
- viewModel中不要传context相关内容 会内存泄漏,如果需要和context绑定,就用
AndroidViewModel,他的生命周期和Application一样长。 - viewModel
不能持久化,他的使用场景和onSaveInstanceState()还是有区别的。
LiveData
- 主要目的
- 可被观察的数据容器类。
- 作用范围
- 用来包装viewmodel中具体字段
- 原理
- 观察者模式
- 使用方式
- LiveData是抽象类,不能直接使用,通常使用
MutableLiveData,如MutableLiveData<Integer> - viewModel在Activity注册后,通过get方法获取对应的livedata包装对象。
- livedata提供observe方法,内置callback处理model->UI的通信。
- livedata提供setValue/postValue(非UI线程),处理UI->model的通信。
- LiveData是抽象类,不能直接使用,通常使用
DataBinding
- 主要目的
- 将一部分数据设置工作放到xml,进一步减轻Activity的工作。
- 作用范围
- xml
- 原理
- 将xml转化成adapter文件,动态处理UI信息,当然也可以通过@BinderAdapter自定义设置adapter信息,在xml中调用
app:自定义方法。
- 将xml转化成adapter文件,动态处理UI信息,当然也可以通过@BinderAdapter自定义设置adapter信息,在xml中调用
- 使用方式
- xml中,通过
<layout>标签标识需要绑定的xml文件(最外层) - 通过
<variable name=$$$ type=$$$>标签,绑定对应的model类 - 通过
<import type=$$$>标签,导入工具类 - 若需要实现UI->model的双向绑定,可借助@Bindable标签实现
- xml中,通过
Room
- 主要目的
- 基于SQLite的ORM数据库,通过注解进行建表、建字段、CURD等,语法更趋近于SQL
- 使用方式
- Entity: 一个Entity对应数据库中一个表,在Java中可被看做一个model。创建标签@Entity(tableName = )
- Dao: @Dao修饰的接口类需要实现CRUD(@Insert、@Delete、@Update、@Query(***))
- DataBase: 创建具体的数据库 @DataBase(entities={**.Class,$$.Class},version = 1)
- Room支持livedata
Navigation
- 主要目的
- navigation的作用范围比较杂,主要是负责app bar(支持顶bar、底部菜单栏、侧边栏等)和多页面之间更便捷的切换联动的。
- 作用范围
- UI相关
- 使用方式
- Navigation Graph 新型xml资源文件,包含app内所有页面及页面关系
- NavHostFragment Fragment容器
- NavController 切换逻辑类
- 扩展功能
- 支持safe args —— 更安全的数据传递(类型转化安全)
- deeplink —— 支持通过PendingIntent或真实URL链接,跳转到app内某个页面。
WorkManager
- 主要目的
- 处理及时性不高的后台任务,做到电量和用户体验间的平衡。
- 特点
- 针对不需要及时完成的任务,如日志发送、备份数据等
- 保证任务一定会被执行,有内置独立的数据库,即使app杀死 or 设备重启 也能够保存信息。
- 兼容范围广,>=API 14,兼容方案:>=API 23 使用JobSchedule,<23使用AlarmManager + 广播
- 底层原理是:Executor
- 使用方式
- 自定义类继承
Worker,重写doWork方法,会返回一个Result对象。 - 支持通过
WorkRequst设置触发条件(充电时、wifi时等等)及延迟时间。 - 通过livedata可以收到任务变化通知
- 支持链式调用
- 自定义类继承
- 注意点
- 非原生机上,可执行性不能被保证
- 用livedata观察周期性任务,收不到success一类的通知
Paging
- 主要目的
- 分页架构,支持分页数据从数据库、网络、or混合的方式取。
- 使用方式
- PagedListAdapter:page适配器
- PagedList: 存取数据List,并负责DataSource合适获取数据以及如何获取
- DataSource:负责数据获取载入工作,有三种方式:1. 约定起始位置及获取数量 2.约定item关键字key及数量 3.约定页数和每页多少个。 -BoundaryCallback:负责统一网络源和数据库源。
界面
Animator & Transition
行为
Download Manager
dataStore
- 主要目的
- 解决了sp一些鸡肋问题,目标用来代替SP
- 介绍
- DataStore基于
事务方式处理数据更新。 - DataStore基于Kotlin Flow存取数据,默认在Dispatchers.IO里
异步操作,避免阻塞UI线程,且在读取数据时能对发生的Exception进行处理。 - 不提供apply()、commit()存留数据的方法。
- 支持SP一次性自动迁移至DataStore中。
- DataStore基于
- 对比
| Feature | SharedPreferences | PreferencesDataStore | ProtoDataStore |
|---|---|---|---|
| 异步API | √ | √ | √ |
| 同步API | √ | × | × |
| UI线程调用安全性(不会有anr等风险) | × | √ | √ |
| 可以发出异常信号 | × | √ | √ |
| 避免运行时异常 | × | √ | √ |
| 保证事务性 | × | √ | √ |
| 支持SP一次性迁移 | × | √ | √ |
| 数据转化安全 | × | × | √ |