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

前言

Jetpack系列

Jetpack从入门到几乎入门(一) - 掘金 (juejin.cn)

Jetpack从入门到几乎入门(二) - 掘金 (juejin.cn)

Jetpack从入门到几乎入门(三) - 掘金 (juejin.cn)

本文是我在学习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
链接:https://juejin.cn/post/7149594482730598408
更多Android学习笔记+视频资料可点击下方卡片获取~

猜你喜欢

转载自blog.csdn.net/datian1234/article/details/127318973