首页 > 其他分享 >Jetpack从入门到几乎入门(一)

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

时间:2023-06-19 12:05:23浏览次数:45  
标签:生命周期 入门 Jetpack ViewModel 几乎 MainViewModel Activity MyObserver


前言

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种状态类型,分别对应当前生命周期状态。

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

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

ViewModel以及Lifecycles 的内容已经基本介绍完了,下一次更新将介绍响应式编程组件LiveData

作者:Tylerthecreator

标签:生命周期,入门,Jetpack,ViewModel,几乎,MainViewModel,Activity,MyObserver
From: https://blog.51cto.com/u_16163442/6512302

相关文章

  • 2022最全面&详细的Android学习指南,零基础快速入门的通道
    随着Android技术栈的不断扩展,不少新的技术如Flutter、RN、小程序等涌入我们的视野,也有越来越多的人投身入Android开发的赛道。无论你是35岁正在遭遇中年职业危机的程序员,还是刚刚毕业的大学生/研究生,想走技术这条路,都需要不断学习,风雨兼程!那么,如何系统的学习Android呢?首先来看看And......
  • Android进阶宝典 -- JetPack Navigation的高级用法(解决路由跳转新建Fragment页面问题)
    相信有相当一部分的伙伴,在项目开发中依然使用Activity作为页面承载体,有10个页面就会有10个Activity,这种方式当然没问题,但是如果涉及到页面间数据共享,那么使用多Activity就不是很方便了,需要Activity传递各种数据,涉及到数据的序列化与反序列化;因此产生了单Activity和多Fragment架构,所......
  • 快速入门|Flutter完整开发实战详解 谷歌架构师独家分享
    前言这几年在大前端的开发领域,选择跨端方案的公司和部门越来越多,一方面是跨平台的前端框架越来越成熟,另一方面也是因原生开发者正逐年减少。所以,在当下掌握一门跨平台的技术栈还是很有必要的,无论从广度还是从深度都会有所帮助。就目前来说有很多主流的跨平台框架,就比如:Flutter、Rea......
  • 实战!如何在 Jetpack Compose 中拥有一个与众不同的 Modifier
    步入正题!相信大家既然已经学习了Compose,那想必也非常熟悉如何使用Modifer了,由于Compose被Android团推设计的非常容易上手,所以有不了解如何使用的朋友可以去看看文档,即可轻松掌握基础的使用!拥有一个与众不同的Modifier,其实就是实现一个特别功能的Modifier,然后使用它去修饰我们......
  • 谷歌内部流出Jetpack Compose最全上手指南,含项目实战演练!
    简介JetpackCompose是在2019Googlei/O大会上发布的新的库。Compose库是用响应式编程的方式对View进行构建,可以用更少更直观的代码,更强大的功能,能提高开发速度。Compose并不是像RecyclerView、ConstraintLayout这种做了一个或者几个高级的UI控件,而是直接抛弃了我们写了N年......
  • WPF 入门笔记 - 05 - 依赖属性
    如果预计中的不幸没有发生的话,我们就会收获意外的喜悦。--人生的智慧-叔本华WPF属性系统这一部分是中途加的,直接依赖属性有点迷糊......
  • 从入门到精通,Android Jetpack 架构实战教程合集
    Jetpack是Google推出的一些库的集合,包含组件、工具、架构方案等,其优势众多:可以减少空指针异常崩溃、内存泄漏,为开发出健壮且流畅的程序提供强力保障;可以消除大量重复样板式的代码,加速Android的开发进程;可以统一开发模式,抛弃传统的MVC,MVP…对于谷歌而言,AndroidJetpack是他......
  • Jetpack系列-Lifecycle使用和源码分析
    1简介和简单使用1.1简介Lifecycle是Jetpack中一个生命周期感知型组件,可执行操作来响应另一个组件(如Activity和Fragment)的生命周期状态的变化。该组件通过感知Activity和Fragment的生命周期事件,在内部维护一个状态,该状态又可以转换成生命周期事件。主要作用就是进行系统组件......
  • Jetpack系列-Room+ViewModel+LiveData+ViewBinding实现MVVM
    Room能和LiveData很好的结合实现MVVM,Room可以利用LiveData的观察者模式,感知Lifecyle的状态,实现数据驱动UI,避免MVP模式下更新UI需要大量回调接口的繁琐。下面整合Room、ViewModel、LiveData、ViewBinding,实现一个简单的MVVM示例项目。1引入依赖引入ViewModel依赖:dependencies{......
  • 在 Debian 12 上安装 KubeSphere 实战入门
    老Z,运维架构师,云原生爱好者,目前专注于云原生运维,云原生领域技术栈涉及Kubernetes、KubeSphere、DevOps、OpenStack、Ansible等。前言知识点定级:入门级KubeKey安装部署KubeSphere和KubernetesDebian操作系统的基本配置Kubernetes常用工作负载的创建KubeSphere......