android jetpack 开源项目(Android中的Jetpack)
android jetpack 开源项目(Android中的Jetpack)allprojects {}repositories {google()mavenCentral()
Android Jetpack是一组软件组件、库、工具和指南,可帮助开发强大的Android应用程序。Jetpack于 2018年由 Google 推出,包括现有的 android 支持库、android 架构组件以及作为单个模块化实体添加的 Android KTX 库。如今,Google Play 商店中近 99% 的应用程序都使用 Android Jetpack 库。此外,为了处理数据和应用程序生命周期的变化/更新,谷歌引入了架构组件. 本文详细解释了该组件的每个库。Jetpack 包含大量库,这些库的构建方式可以协同工作并构建强大的移动应用程序。其软件组件分为 4 类:
- 基础组件
- 架构组件
- 行为组件
- 用户界面组件
此外,架构组件可以分类如下:
- Room
- WorkManager
- Lifecycle
- ViewModel
- LiveData
- Navigation
- Paging
- Data Binding
Android Jetpack 及其架构组件定义了一些关键原则,作为开发良好且强大的移动应用程序的安全途径,应该遵循这些原则。它不支持任何特定的架构模式,但建议将关注点和 UI 与模型的控制明确分离。通过遵循这些规则,开发人员可以避免与生命周期相关的问题,并且可以轻松测试和维护应用程序。
以下是架构组件的元素及其职责- View 层由Activity / Fragment表示。它们只处理用户交互和观察以及展示取自ViewModel的LiveData元素。
- ViewMode l 对View的 Lifecycle 进行检查,并负责在设备的配置更改或其他 android 生命周期事件期间保持数据的一致性。
- Repository是一个没有适当实现的类,负责从所有来源收集数据。它处理所有数据并将它们转换为可观察的 LiveData并使其可供ViewModel 访问。
- Room是一个 SQLite 映射库,它克服了SQLite 数据库的挑战,例如编写样板代码和在编译时进行查询检查。它能够使用可观察的 LiveData直接返回查询。
- 在应用项目的build.gradle 文件中添加 google 存储库。
buildscript {
repositories {
google()
mavenCentral()
}
- Google Maven 存储库中提供了所有 Jetpack 组件,将它们包含在bUIld.gradle文件中
allprojects {
repositories {
google()
mavenCentral()
}
}
架构组件1. 房间组件SQLite从一开始就满足了Android中数据库的需求。但是,它有一些严重的缺点,例如在编译时不检查查询,不保存普通的旧 Java 对象(通常称为POJO)。开发人员还需要编写大量样板代码,以使 SQLite 数据库在 Android OS 环境中工作。Room 组件作为SQLite 对象映射库出现,它克服了所有提到的挑战。Room 将查询直接转换为对象,在编译时检查查询中的错误,并且还能够持久化 Java POJO。
此外,它会根据给定的查询结果生成 LiveData 结果/可观察数据。由于 Room 组件的这种多功能性,Google 官方支持并推荐开发者使用它。Room 由以下子组件组成:
- 实体:它是 Room 在数据库中为其创建表的带注释的类。类的字段表示表中的列。
- DAO(Data Access Object):负责定义访问数据库和执行操作的方法。
- 数据库:它是一个扩展RoomDatabase类的抽象类,它充当底层应用程序关系数据的主要访问点。
房间组件的优点:
- 减少样板代码
- 简化数据库访问机制
- 易于实施迁移
- 测试能力高
WorkManager API 提供了一个最佳解决方案来管理 Android 中的后台任务,这些任务本质上是可延迟的(可以稍后运行并且仍然有用)以及有保证的(即使设备重新启动也可以运行)。它能够涵盖 Android 的省电功能以及在有或没有 Google Play 服务的情况下运行的能力是它在开发人员中受欢迎的原因。此外,它还向后兼容 API 级别 14。
android 设备能够分块下载文件/文档,即偶尔(如用户根据 WiFi 网络的可用性恢复下载)以及即使设备重新启动也可以保存下载状态的功能,这仅是因为 WorkManager API . 它的任务执行取决于用户提出请求的顺序,并且对于每个工作请求,它返回显示在设备 UI 上的状态。
WorkManager 组件的优点:
- 提供向后兼容性
- 任务的调度和链接是可能的
- 用户可以跟踪/状态的任务。
android 组件的生命周期状态的详细信息存储在Lifecycle类中,它允许其他组件/对象观察此状态。如果一个 android 组件能够检测到其他组件生命周期状态的变化并做出相应的响应,那么它就是生命周期感知的。对于开发人员来说,正确管理应用程序生命周期是一项具有挑战性的任务,因为它可能导致内存泄漏和应用程序崩溃等严重问题。android.arch.lifecycle包通过管理系统直接附加到组件的生命周期来方便开发人员。通过在所需类中实现LifecycleObserver接口,可以将其配置为生命周期感知。
有两种方法可以创建生命周期感知的 Activity / Fragment:
- 扩展 LifecycleActivity 或 LifecycleFragment
class MainActivity : LifecycleActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
- 通过注解连接 LifecycleObserver 和 Lifecycle 事件
class MainActivityObserver : LifecycleObserver AnkoLogger {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
info(“onResume”)
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {
info(“onPause”)
}
}
生命周期感知组件的优势:
- 帮助创建有组织的应用程序组件
- 易于测试和维护组件
- 执行任务所需的代码更少
ViewModel 是支持 UI 组件数据的 Android Jetpack 架构组件中最关键的类之一。其目的是保存和管理与 UI 相关的数据。此外,它的主要功能是保持完整性,并允许数据在屏幕旋转等配置更改期间提供服务。Android 设备中任何类型的配置更改都会重新创建应用程序的整个活动。这意味着如果数据没有从被破坏的活动中正确保存和恢复,数据将会丢失。为避免这些问题,建议将所有 UI 数据存储在 ViewModel 而不是 Activity 中。
Activity 必须扩展 ViewModel 类才能创建视图模型:
class MainActivityViewModel : ViewModel() {
…………
……..
}
ViewModel 组件的优点:
- 有助于在配置更改期间进行数据管理
- 减少 UI 错误和崩溃
- 软件设计的最佳实践
该组件是一个可观察的数据持有者类,即可以观察到包含的值。LiveData 是一个生命周期感知组件,因此它根据其他应用程序组件的生命周期状态执行其功能。此外,如果观察者的生命周期状态处于活动状态,即 STARTED 或 RESUMED,则只有 LiveData 更新应用程序组件。LiveData 总是在进行任何更新之前检查观察者的状态,以确保观察者必须处于活动状态才能接收它。如果观察者的生命周期状态被破坏,LiveData 能够将其移除,从而避免内存泄漏。它使数据同步的任务更容易。
LiveData需要实现onActive和onInactive方法:
class LocationLiveData(context: Context)
: LiveData<Location>() AnkoLogger LocationListener {
private val locationManager: LocationManager =
context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
override fun onActive() {
info(“onActive”)
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER 0 0f this)
}
override fun onInactive() {
info(“onInactive”)
locationManager.removeUpdates(this)
}
// ….
}
为了观察 LiveData 组件观察者(LifecycleOwner Observer<T>)方法被调用:
fun observeLocation() {
val location = LocationLiveData(this)
location.observe(this
Observer { location ->
info(“location: $location”)
})
}
}
LiveData 组件的优点:
- UI 根据数据中的适当变化进行更新
- 它删除了停止或破坏的活动,从而减少了应用程序崩溃的机会
- 没有内存泄漏,因为 LiveData 是一个生命周期感知组件。
Android 架构的导航组件是设计应用内 UI 的框架。开发人员可以按照单活动应用程序架构来构建应用程序 UI。导航管理与应用程序中的片段事务相关的复杂性。它还便于开发人员显示转换和返回行为。
通过使用导航组件,您可以获得其他架构组件以及Lifecycle和ViewModel的所有好处。它有助于实现基本的导航样式,比如简单的按钮点击到复杂的导航模式,比如应用栏和导航抽屉。此外,它还支持深度链接和帮助程序,使该组件能够与导航抽屉和底部导航连接。
导航组件的优点:
- 通过动画可视化简化过渡
- 支持深度链接
- 处理分片交易
- 支持常见和复杂的导航模式
在开发 android 应用程序时,组织数据加载过程非常重要。大多数情况下,应用程序一次显示一个活动/片段,因此只需要加载和显示一小部分数据。但是,与此同时,该应用程序正在处理一个当前无用的大型数据集。因此,这是必须处理的应用程序的关键区域,否则会导致设备电池和网络带宽的浪费。
Android 架构组件的Paging 库为这些问题提供了最佳解决方案。该库提供了以谨慎的方式缓慢加载应用程序数据的工具。此外,对于那些显示数据不断更新的应用程序,分页是一个非常协作的库,因为它提供了无界站点列表以及大型但有界列表。以下是通过分页库加载数据的三种常用方式:
- 加载数据存储在设备数据库中
- 通过充当数据库的缓存通过网络加载数据
- 通过从后端服务器服务加载数据
Paging 组件的优点:
- 易于与 Recycler View 集成以显示大型数据集。
- 与 LiveData 和 RxJava 兼容,用于更新 UI 数据
- 谨慎地逐渐加载数据
数据绑定库是一个支持库,它提供了将活动/片段中的 UI 组件绑定到应用程序的数据源的功能。该库以声明性格式而不是以编程方式执行此绑定任务。下面是一个准确理解这个库工作的例子:
要查找TextView小部件并将其绑定到 ViewModel 变量的 userName 属性,请调用findViewById()方法:
TextView textView = findViewById(R.id.sample_text);
textView.setText(viewModel.getUserName());
使用Data Binding库后,上面的代码通过赋值表达式的变化如下:
<文本视图
android:text=”@={viewmodel.userName}” />
数据绑定组件的优点:
- 通过删除活动中调用的 UI 框架,使代码更简单且易于维护。
- 允许类和方法观察数据的变化
- 允许将对象和填充对象作为可观察的集合工作。
添加 Jetpack 架构组件(例如 LiveData 和 ViewModel)的代码片段:
dependencies {
def lifecycle_version = “2.3.1”
implementation “androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version”
implementation “androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version”
…
}