当前位置: 首页 > 图灵资讯 > 技术篇> Jetpack从入门到几乎入门(一)

Jetpack从入门到几乎入门(一)

来源:图灵教育
时间:2023-06-25 14:05:58

前言

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_ANYActivity类型 任何生命周期回调匹配

写完以上代码后,还要做到 MyObserver收到通知后,我们可以使用它LifecycleOwner类别实现上述任务。

首先,我们需要得到它LifecycleOwner实例。事实上,它通常是实现的LifecycleOwnerAndroidX库自动帮助我们完成了操作,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对应于当前的生命周期状态。

Jetpack从入门到几乎入门(一)_android

图片来源于郭霖《第一行代码》第三版

Vifewmodel、Lifecyclesel 基本介绍了内容,下次更新将介绍响应式编程组件LiveDatata

作者:Tylerthecreator