Jetpack

常见jetpack组件小结

Posted by Ann on December 21, 2021

概述jetpack常见组件功能、使用方式。

简介

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

👉👉jetpack开发文档

架构

LifeCycle

  • 主要目的
    • 系统组件生命周期与UI之间解耦
  • 作用范围
    • Activity、Fragment、Service、Application
  • 原理
    • 观察者模式。LifecycleOwner(被观察者),LifecycleObserver(观察者)。LifeCycleOwner通过注解@OnLifeCyclerEvent通知观察者。
  • 使用方式
    • SupportActivity等系统类已经默认实现了观察者方法,对于使用方来说,需要:
        1. implements LifecycleObserver方法
        1. 通过 @OnLifeCyclerEvent(Lifecycle.Event.ON_***)方法进行监听
        1. 在Activity中获取观察者 getLifecycle() 并进行addObserver绑定
    • 对应的Activity、Fragment被观察者LifecycleOwner
    • 对应的Sevice被观察者LifecycleService
    • 对应的Application被观察者ProcessLifecycleOwner

ViewModel

  • 主要目的
    • 解耦model与系统组件生命周期。他独立于配置变化,Activity因为翻转屏幕等引起的销毁重建不会影响viewmodel。
  • 作用范围
    • 数据类,类似于datamanager,脱离UI独立处理数据的逻辑类。
  • 原理
    • 在Activity中默认实现了ViewModelStoreOwner接口。在Activity中初始化viewmodel需要传入对应的class类,而ViewModelStoreOwner中持有一个HashMap<viewModel类名,viewModel对象>,会进行统一的clear逻辑。
  • 使用方式
    • 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的通信。

DataBinding

  • 主要目的
    • 将一部分数据设置工作放到xml,进一步减轻Activity的工作。
  • 作用范围
    • xml
  • 原理
    • 将xml转化成adapter文件,动态处理UI信息,当然也可以通过@BinderAdapter自定义设置adapter信息,在xml中调用app:自定义方法
  • 使用方式
    • xml中,通过<layout>标签标识需要绑定的xml文件(最外层)
    • 通过<variable name=$$$ type=$$$>标签,绑定对应的model类
    • 通过<import type=$$$>标签,导入工具类
    • 若需要实现UI->model的双向绑定,可借助@Bindable标签实现

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的作用范围比较杂,主要是负责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中。
  • 对比
Feature SharedPreferences PreferencesDataStore ProtoDataStore
异步API
同步API × ×
UI线程调用安全性(不会有anr等风险) ×
可以发出异常信号 ×
避免运行时异常 ×
保证事务性 ×
支持SP一次性迁移 ×
数据转化安全 × ×

基础

AppCompact