Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。
1. Android Jetpack组件的优势:
Jetpack推出的主要目的是为了能够让开发者更加快速、方便以及高质量的完成产品开发
- 轻松管理应用程序的生命周期,后台任务的管理,导航的处理等
- 利用Jetpack组件进行开发可以有效减少内存溢出、崩溃的概率,提升应用开发的质量
2. Jetpack中包含的库包括:
- ViewModel:帮助管理UI组件的生命周期并存储和管理UI相关的数据。
- LiveData:提供了响应式编程的功能,可以让数据在数据源发生变化时自动更新UI。
- Room:提供了一个抽象层,可以让开发者方便地访问和管理SQLite数据库。
- Navigation:提供了一种简单、一致的方式来处理应用程序的导航。
- WorkManager:提供了一种简单、可靠的方式来管理后台任务。 除此之外,Jetpack还包括了诸如Paging、Data Binding、Preferences、Security等库,这些库都旨在简化开发过程并提高应用程序的性能和可靠性。
3. Jetpack四件套介绍
3.1 Lifecycle
Life生命,cycle周期,顾名思义:Lifecycle是生命周期的意思。它是Jetpack中的一个 生命周期感知型组件 ,可执行操作来感知响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。
3.1.1 使用LifeCycle有什么好处?
LifeCycle可以帮助开发者创建可感知生命周期的组件。这样,组件便能够在其内部管理自己的生命周期,从而降低模块间的耦合度,并降低内存泄漏发生的可能性。
举个例子,我们经常需要在页面的onCreate()方法中对组件进行初始化,在onPause()方法中停止组件,而在页面的onDestroy()方法中对组件进行资源回收工作。这样的工作非常烦琐,会让页面与组件之间的耦合度变高。但这些工作又不得不做,因为这可能会引发内存泄漏。
3.1.2 正确使用LifeCycle
使用思路:
- 构建一个 Lifecycle 对象(通过一个实现了 LifecycleOwner 接口的对象的 getLifecycle()方法返回),这个对象就是一个被观察者,具有生命周期感知能力
- 构建一个 LifecycleObserver 对象,它对指定的 Lifecycle 对象进行监听
- 通过将 Lifecycle 对象的 addObserver(…) 方法,将 Lifecycle 对象和 LifecycleObserver 对象进行绑定
3.2ViewModel
ViewModel是Jetpack AAC的重要组件,同时也有一个同名抽象类。 ViewModel,意为 视图模型,即为界面准备数据的模型。简单理解就是,ViewModel为UI层提供数据。
3.1.1ViewModel使用:
①思路:
- 导入依赖
- 继承ViewModel自定义MyViewModel
- 在MyViewModel中编写获取UI数据的逻辑
- 使用LiveData将获取到的UI数据抛出
- 在Activity/Fragment中使用ViewModelProvider获取MyViewModel实例
- 观察MyViewModel中的LiveData数据,进行对应的UI更新。
②总结:
- ViewModel的使用很简单,作用和原来的Presenter一致。只是要结合LiveData,UI层观察即可。
- ViewModel的创建必须通过ViewModelProvider。
- 注意到ViewModel中没有持有任何UI相关的引用。
- 旋转手机重建Activity后,数据确实恢复了。
3.3 LiveData
LiveData是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者,适合与ViewModel结合在一起使用,就可以让ViewModel将数据的变化主动通知给Activity。
3.3.1LiveData的使用
在开发中我们比较常用的就是 MutableLiveData ,他给我们暴露好了修改对应值的方法,LiveData的作者认为我们有这个功能就够了。
public class MutableLiveData<T> extends LiveData<T> {
public MutableLiveData(T value) {
super(value);
}
public MutableLiveData() {
super();
}
// 在子线程 中 更改数据 就需要用到postValue方法
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
一个简单的使用MutableLiveData的实例:
class LiveDataTestActivity : AppCompatActivity() {
val TAG = "LiveDataTestActivity"
var index = 1
val liveData:MutableLiveData<String> by lazy {
MutableLiveData<String>().also {
it.value = "周杰伦"
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var binding = ActivityLiveDataTestBinding.inflate(layoutInflater)
setContentView(binding.root)
liveData.observe(this){
Log.e(TAG,it)
}
}
fun changeLivaData(view: View) {
liveData.value = "周杰伦${index++}"
}
}
首先调用liveData.observe注册一个观察者,观察者注册商后,用户点击xml上的按钮,liveData 会调用setValue方法(因为是kotlin省略了set) 然后在observe的回调中会打印对应的值,那么我们看看这个最终是怎么通知观察者 回调的呢。liveData调用了setValue方法,最后是调到Super了,也就是LiveData中的setValue方法。
3.4 DataBinding
DataBinding 是 Google 在 Jetpack 中推出的一款数据绑定的支持库,他的目的是一个帮助我们实现数据和UI绑定,并可以进行双向绑定。
3.4.1优势
- 项目更加简介,代码可读性更高。
- 不再需要
findViewById()
。 - 布局文件可以包含简单的业务逻辑。
3.4.2DataBinding使用
实例化布局文件了,我们删除掉传统的setContentView()
,通过 DataBindingUtil.setContentView()
来实例化文件。实例化返回的布局文件对象,名字和布局文字名字一致,遵循大驼峰命名规则,后面加上Binding。然后通过binding对象得到控件,控件命名遵循小驼峰规则。
ActivityMainBinding binding=DataBindingUtil.setContentView(this,R.layout.activity_main);
binding.textHome.setText("hello databinding!");
3.4.3数据绑定
如何将数据传递到布局文件中呢?首先,在布局文件中定义布局变量,指定对象的名字和类型,当然数据的操作在
标签里。data标签里用于放在布局文件中各个UI控件所需要的数据,这些数据类型可以是自定义类型,也可以是基本类型。
<data>
<variable
name="book"
type="com.yhj.jetpackstudy.Book" />
<variable
name="number"
type="Integer" />
</data>
public class Book {
private int id;
private String title;
private String author;
}
布局中的数据绑定使用“@{}”语法写入属性中,通过布局表达式的形式设置TextView
的text。
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{book.title}" />
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{Constants.APP_ID}" />
DataBinding为了方便使用,对布局变量提供了Setter
类,因此,在Activity
中,通过setBook()
,将Book对象传递给布局变量。
Book book = new Book(0, "android", "yhj");
//BR类似于Android中的R类,由DataBinding自动生成,用于存放所有布局变量的id。
//DataBinding为了方便使用提供了Setter类,直接使用setXxx()
//binding.setVariable(BR.book,book);
binding.setBook(book);
绑定后,就不需要再Activity中设置内容了,实现了布局与页面的解耦。 DataBinding具有Null校验,如果绑定值为null,则分配默认值null,如果类型为int
,默认值为0。