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