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
AppCompatData BindingDownload ManagerAnimation & transitions
Android KTXLifecyclesMedia & playbackAuto
MultidexLiveDataNotificationsEmoji
TestNavigationPermissionsFragment
-PagingSharingLayout
-RoomSlicesPalette
-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和数据库框架Room

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值