Jetpack系列:
Jetpack从入门到几乎入门(1)
Jetpack从入门到几乎入门(2)
Jetpack从入门到几乎入门(3)
本文是我对guolin大神《第一行代码》第三版Jetpack的知识总结。本文代码参考第一行代码第三版
在阅读本文之前,您需要掌握kotlin语言的基本语法,并对activity的生命周期有一定的了解
Jetpack特性Jetpack是一个开发组件工具集,Jetpack Compose 用于构建原生Androidid 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通过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转向Viewmodel 传递参数如果您想在重启程序后不丢失数据,您需要在退出程序时保存当前的计数,然后在重新打开程序时读取以前保存的计数,并将其传输给mainviewmodel。需要帮助将参数传输到viewmodelViewModelProvider.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本身就是Lifecycleownernt 因此,在Mainactivity中, 可以这样写:
//lifecycleOwner.lifecycle.addObserver(MyObserver()//首先调用Lifecycleowner 获得Lifecycle()方法的Lifecycle对象,然后调用adddobserver()观察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对应于当前的生命周期状态。
图片来源于郭霖《第一行代码》第三版
Vifewmodel、Lifecyclesel 基本介绍了内容,下次更新将介绍响应式编程组件LiveDatata
作者:Tylerthecreator