前言
Jetpack系列:
Jetpack从入门到几乎入门(一)
Jetpack从入门到几乎入门(二)
Jetpack从入门到几乎入门(三)
本文是我在学习guolin大神的《第一行代码》第三版Jetpack部分的知识总结,文中代码参考自《第一行代码》第三版
在阅读本文前,您需要掌握kotlin语言的基本语法且对Activity的生命周期有一定的了解
Jetpack特性
Jetpack是一个开发组件工具集,Jetpack Compose 是一个用于构建原生Android UI 的现代化工具包,它基于声明式的编程模型,因此你可以简单地描述UI的外观,而Compose则负责其余的工作-当状态发生改变时,你的UI将自动更新。由于Compose基于Kotlin构建,因此可以与Java编程语言完全互操作,并且可以直接访问所有Android和Jetpack API。它与现有的UI工具包也是完全兼容的,因此你可以混合原来的View和现在新的View,并且从一开始就使用Material和动画进行设计。
Jetpack组件主要分为四个方向:基础,架构,行为和UI
基础 | 架构 | 行为 | UI |
AppCompat | Data Binding | Download Manager | Animation & transitions |
Android KTX | Lifecycles | Media & playback | Auto |
Multidex | LiveData | Notifications | Emoji |
Test | Navigation | Permissions | Fragment |
- | Paging | Sharing | Layout |
- | Room | Slices | Palette |
- | ViewMode | - | TV |
- | WorkManager | - | Wear OS by Google |
ViewModel
再传统开发任务中,Activity承担的任务过重。ViewModel的重要作用之一是存放界面相关的数据,在Activity配置更改重建时(比如屏幕旋转)保留数据,实现UI组件(Activity与Fragment、Fragment与Fragment)间实现数据共享,帮Activity 分担一部分工作
使用前的准备
添加依赖
dependencies {
...
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
}
示例:写一个计数程序,每按一次按钮屏幕上的数字就加一,ViewModel存放count
先新建MainViewModel
类
class MainViewModel : ViewModel() {
var counter = 0
}
Activity
class MainActivity : AppCompatActivity() {
lateinit var viewModel: MainViewModel
private val binding = ActivityMainBinding.inflate(layoutInflater)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
/**通过ViewModelP rovider 来获取ViewModel 的实例
* 因为ViewModel 有其独立的生命周期,并且其生命周期要长于Activity 。
如果我们在onCreate()方法中创建ViewModel 的实例,那么每次onCreate()方法执行的时
候,ViewModel 都会创建一个新的实例,这样当手机屏幕发生旋转的时候,就无法保留其中的
数据了
*/
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
binding.plusOneBtn.setOnClickListener {
viewModel.counter++
refreshCounter()
}
refreshCounter()
}
//用来刷新当前的
private fun refreshCounter() {
binding.infoText.text = viewModel.counter.toString()
}
}
向ViewModel 传递参数
如果想要重启程序后不会丢失数据,就需要在退出程序的时候对当前的计数进行保存,然后在重新打开程序的时候读取之前保存的计数,并传递给MainViewModel。要将参数传递到ViewModel需要借助ViewModelProvider.Factory
实现。
修改MainViewModel
类
class MainViewModel(countReserved: Int) : ViewModel() {
var counter = countReserved
}
新建一个MainViewModelFactory
类,并让它实现ViewModelProvider.Factory
接口
class MainViewModelFactory(private val countReserved: Int) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MainViewModel(countReserved) as T
}
}
ViewModelProvider.Factory
接口要求我们必须实现create()
方法,在create()
方法中我们创建了带有已保存数值的MainViewModel
实例
ViewModel 中比较重要的内容就是这些了。
Lifecycles
简介
在平时的开发任务中,可能需要在其他类中感知Activity 的生命周期,这通常要消耗一定的工作量,同时要在Activity中编写许多逻辑。Lifecycles的出现就优雅的解决了这个问题,Lifecycles组件的使用使得感知Activity生命周期的过程变得更加简洁
使用方法
新建一个MyObserver类,并让它实现LifecycleObserver接口
class MyObserver : LifecycleObserver {
}
接着定义activityStart()
和activityStop()
这两个方法(activityStart()
在Activity 的onStart()
中执行,activityStop()
在onStop()
中执行),这两个方法实现日志打印Activity生命周期的功能
class MyObserver : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun activityStart() {
Log.d("MyObserver", "activityStart")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun activityStop() {
Log.d("MyObserver", "activityStop")
}
}
在上述方法中,我们要使用@OnLifecycleEvent()
注解,我们需要向注解传入一项代表生命周期事件类型的参数,这个参数有七种:ON_CREATE、ON_START、ON_RESUME、ON_PAUSE、ON_STOP和ON_DESTROY
,参数名与Activity生命周期回调匹配,所以activityStart()
和activityStop()
方法就将分别在Activity 的onStart()
和onStop()
触发的时候执行。还有一种ON_ANY
类型与Activity 的任何生命周期回调匹配
写完上述代码后,还要使 MyObserver
接收到通知。我们可以使用LifecycleOwner
类实现上述任务。
首先我们需要获取LifecycleOwner
实例。其实通常情况下实现LifecycleOwner
的操作已经由AndroidX库自动帮我们完成了,Activity、Fragment本身就已经是LifecycleOwner 的实例,所以在MainActivity 当中就可以这样写:
//lifecycleOwner.lifecycle.addObserver(MyObserver())
//首先调用LifecycleOwner 的getLifecycle()方法,得到一个Lifecycle对象,然后调用它、的addObserver()方法来观察LifecycleOwner 的生命周期,再把MyObserver 的实例传进去就可以了
//但在MainActivity 当中就可以这样写
class MainActivity : AppCompatActivity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
...
lifecycle.addObserver(MyObserver())
}
...
}
这样,MyObserver 就能自动感知到Activity 的生命周期了
若想感知当前的生命周期状态,将Lifecycle
对象传入即可,Lifecycle.currentState
会以枚举类型返回值返回INITIALIZED、DESTROYED、CREATED、STARTED、RESUMED这5种状态类型,分别对应当前生命周期状态。
图片源自郭霖《第一行代码》第三版
ViewModel以及Lifecycles 的内容已经基本介绍完了,下一次更新将介绍响应式编程组件LiveData
作者:Tylerthecreator
标签:生命周期,入门,Jetpack,ViewModel,几乎,MainViewModel,Activity,MyObserver From: https://blog.51cto.com/u_16163442/6512302