草庐IT

Android Jetpack组件一览

谁动了我的代码 2023-09-21 原文

官网简介

Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。

Jetpack 是 Google 为解决 Android 开发碎片化,打造成熟健康生态圈提出的战略规划,是 Google 对 Android 未来提出的发展方向,同时它也是众多优秀 Android 组件的集合。

JetPack的构成图

Jetpack主要特性:

1.加速开发

组件可单独使用,也可以协同工作,当使用kotlin语言特性时,可以提高效率。

2.消除样板代码

Android Jetpack可管理繁琐的Activity(如后台任务、导航和生命周期管理)。

3.构建高质量的强大应用

Android Jetpack组件围绕现代化设计实践构建而成,具有向后兼容性,可以减少崩溃和内存泄漏。

Jetpack常见组件介绍

一、Lifecycle

lifecycle通过观察者模式监听生命周期

被观察者(lifecycleOwner):activity,Fragment声明周期变化getLifecycle().addObversever(自己的类)绑定观察者—>通知 dispatch(Event)—>观察者(lifecycleObserver):用户类,FrameWork层类,mObserverMap:存放了所有观察者—>反射拿到观察者的class对象—>mInfo:存放了所有带注解的方法@OnLifecycleEvent(Lifecycle.Event.ON_CREATE))—> mMethod.invoke(target,source)—>调用相应api,需要监听哪个声明周期则重写哪个方法就好

mState:从左往右,从右往左返回状态值 监听生命周期需要实现lifecycleObserver接口

二、liveData

liveData是一个数据持有类

  • 能够感知组件的生命周期,确保仅更新活跃组件
  • 不会因Activity停止而导致崩溃,如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件
  • 持有的数据可被观察者观察,在底层数据更改时通知视图
  • 一对多观察者:观察者会绑定lifecycle对象,在生命周期结束时会自我清理(不会发生内存泄露)
  • 共享资源:可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。

liveData使用:

  • MutableLiveData:LiveData(抽象类)的子类
  • liveData.postValue():可在任意线程下执行(切换线程操作)
  • liveData.setValue():只能在主线程中执行
  • liveData.observe():注册观察者
  • observe()源码:注册观察者保存在mObserves(map)中
  • 感知生命周期:owner.getLifecycle().addObserver(wapper),改变时调用onstatechanged()

观察者有两种情况会被回调:

1、postValue时会遍历观察者然后回调

2、当组件生命周期发生变化或者第一次注册观察者时回调

粘性事件:

这里得满足两个条件会触发粘性事件 1.数据发送早于注册监听 2.监听者的owner生命周期进入活跃状态

三、ViewModel和DataBinding

  • viewModel:注重以生命周期的方式存储和管理界面相关数据,不受activity生命周期影响
  • 数据持久化:生命周期不受限制
  • 异步回调问题不会造成内存泄露
  • 隔离model层和view层:解耦
  • Fragment间共享数据
  • DataBinding:实现双向绑定,数据和UI同步

作用:当数据源发生改变时,及时更新给UI(p层做的事情交给系统源码去做)

四、Navigation和Fragment

Navigation:导航(回退栈)

三大件:

Navigation Graph:导航图,包含了所有导航相关信息的XML资源。一般防止在res/navigation目录下

NavHost:容器,用来显示Fragment的,即Activity中的fragment,要求实现NavHost

NavController:在NavHost中管理应用导航的对象

一句话就是,通过NavController,获取当行图中的特定路径以及目标,导航到特定的目标放到NavHost中

Navigation是用来管理Fragment的切换,并且可以通过可视化的方式,看见APP的交互流程。

优势:

1、可视化的页面导航图,可以编辑各个组件之间的跳转关系 2、优雅的支持Fragment之间的转场动画 3、通过第三方的插件(SafeArgs(Gradle插件))支持Fragment之间类型安全的参数传递 4、通过NavigationUI类,对菜单,底部导航,抽屉菜单导航进行方便统一的管理 5、支持通过deeplink直接定位到Fragment

五、Room数据库

轻量级orm数据库(关系映射型),本质上sqlite抽象层,类似于Retrofit库,Room在开发阶段通过注解标记相关功能,编译时自动生成impl实现类

数据库框架的两种实现思路:

关系映射型(orm):根据类对象通过反射的手段获取到类名以及成员变量名作为表名和字段名

缺点:无法确定类对象中有哪些成员不需要创建表字段

注解+反射:每个业务模块完全独立,不浪费资源,要自定义注解和处理注解

Room三大件:

1、Entity:实体类,对应的是数据库的一张表结构。需要使用注解 @Entity 标记。 2、Dao:包含访问一系列访问数据库的方法。需要使用注解 @Dao 标记。 3、Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。需要使用注解 @Database 标记。 使用@Database注解需满足以下条件: 1)定义的类必须是一个继承于RoomDatabase的抽象类。 2)在注解中需要定义与数据库相关联的实体类列表。 3)包含一个没有参数的抽象方法并且返回一个带有注解的 @Dao。

六、workManager

workManager:可延迟运行,并在应用退出或重启时能可靠运行任务

应用场景:埋点上传,非即时性上传与下载,同步数据和处理数据

三大件:

1、Worker:我们要执行的具体任务。需要继承Worker,重写doWork方法,然后在里面写具体的逻辑。 2、WorkRequest:上面的Worker是定义了我们要在后台的任务,而这个类是对Worker的包装。 下面两个都是继承了WorkRequest: OneTimeWorkRequest: 只执行一次的任务 PeriodicWorkRequest: 重复执行的任务(重复间隔大于15分钟) 3、WorkManager:是对WorkRequest的管理类。

七、pager

pager:分页加载

三大件:

  • DataSource:数据源,获取数据
  • pagedList:承载数据,可理解为一页数据的集合
  • pagedListAdapter:对RecyclerViewAdapter的一个扩展

以上就是Jetpack的各大常用组件介绍;有关更多Jetpack的学习或者Android技术的进阶,大家可以参考这本免费的电子册《Android核心进阶技术手册》
里面包含Android开发的各个技术点。整理不易,多点赞+转发收藏哦!

总结

Jetpack的出现代表谷歌标准化开发模式的推进,代表了Android开发的未来大致方向,意味着Android发展已经从碎片化转向统一化。现在大多公司的android岗位都开始要求或者以会kotlin,jetpack为加分项以后jetpack开发也将成为大趋势。

jetpack单个库的学习比较简单,但在正规的项目中都是要联在一起使用的。而且由于使用jetpack的原因,项目都比较精简,如果运用不熟练,改bug或者开发新功能就会很难下手。大家学习jetpack的时候要把常用的库理解清楚,这样就会在jetpck项目框架的理解和功能的开发方面有更好的方案。

有关Android Jetpack组件一览的更多相关文章

  1. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  2. ruby - 模块化、基于组件的 Sinatra 应用程序的架构 - 2

    我正在开发一个包含大约10个不同功能组件的Sinatra应用程序。我们希望能够将这些组件混合并匹配到应用程序的单独实例中,完全从config.yaml文件配置,如下所示:components:-route:'/chunky'component_type:FoodListercomponent_settings:food_type:baconmax_items:400-route:'places/paris'component_type:Mappercomponent_settings:latitude:48.85387273165654longitude:2.340087890625-

  3. ruby - 如何使用( ruby ) Rack 中间件组件设置 cookie? - 2

    我正在为需要有条件地设置cookie的Rails应用编写Rack中间件组件。我目前正在尝试设置cookie。通过谷歌搜索,这似乎应该可行:classRackAppdefinitialize(app)@app=appenddefcall(env)@status,@headers,@response=@app.call(env)@response.set_cookie("foo",{:value=>"bar",:path=>"/",:expires=>Time.now+24*60*60})[@status,@headers,@response]endend它不会给出错误,但也不会设置coo

  4. ruby-on-rails - 哪些组件使 VIM 成为一个好的(伟大的)ruby 编辑器? - 2

    我正在linux机器上学习rubyonrails并磨练我的VIM技能(skillz?)。当我在使用C++的时候开始使用VIM时,我有一个friend有一个很棒的vimfiles文件夹,里面有很多东西可以开始使用。从头开始,vim很棒,但感觉它还可以做得更好。我目前有:vim-rubybufferexplorerxml-edit(虽然我目前没有它可以处理erb文件)我知道这只是一些更有经验的vim/ruby开发人员所拥有的东西的皮毛(包括vim.rc文件中的一次性)。在某个地方是否有一个列表(或者我们可以创建一个)使ruby​​(和rails)编程更有趣所需的一堆标准vim配置?是否有一

  5. 修改第三方UI组件库样式的四种方法 - 2

    前提:当我们要修改vant组件库中Tabbar图标大小的样式(原图标是字体图标,大小由font-size控制)。  字体图标字体大小由css变量(--van-tabbar-item-icon-size)控制, 1.插槽方法结论:当你想要自定义使用插槽时,插入自己的元素,那么可以直接在当前作用域直接修改元素的样式。自定义img{height:28px}传入图片,用height属性控制图片大小,达到与字体图标相同效果2.全局定义变量结论:全局定义一个变量,覆盖它默认变量的值定义变量缺点:全局修改。 :root{--van-tabbar-item-icon-size:30px!important;/

  6. Vue学习笔记:Vue element-ui中table组件的使用----接入后端数据 - 2

    记个笔记以免遗忘,建议还是查看Element-UI提供的官方文档学习,自己摸索比较难受官方文档:Element-UI组件TableElement-UI官网提供了许多Table格式,这里以一个带有筛选器的表格为例表格的官网显示效果:直接将官方提供的示例代码贴入.vue文件中即可使用显示的数据是通过data()方法提供的假数据。方法见下:data(){return{tableData:[{date:'2016-05-02',name:'王小虎',address:'上海市普陀区金沙江路1518弄'},{date:'2016-05-04',name:'王小虎',address:'上海市普陀区金沙江路1

  7. uni-app制作一个左侧导航scroll-view组件,并和页面主体展示联动 - 2

    先给大家看看最终效果首先我们来定义数据data(){ return{ lsit:[ 'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic118.nipic.com%2Ffile%2F20161216%2F24271963_122609717000_2.jpg&refer=http%3A%2F%2Fpic118.nipic.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1656923017&t=183ece148b13b64e9dd503afd1b15c91'

  8. javascript - Reactjs:如何在安装组件之前获取要加载的数据? - 2

    有些奇怪的事情发生了,我一直在阅读React文档,他们讨论了生命周期以及如何在渲染组件之前做一些事情。我正在尝试,但我尝试的一切都失败了,总是组件首先进行渲染,然后调用componenWillMount、..didMount等。在调用这些函数之后,渲染再次发生。我需要先加载数据以填充状态,因为我不希望初始状态为null,我希望它包含自初始呈现以来的数据。我正在使用Flux和Alt,这是Action@createActions(flux)classGetDealersActions{constructor(){this.generateActions('dealerDataSuccess

  9. javascript - 为什么需要重新打开组件类来指定位置参数? - 2

    在ember中为组件类指定位置参数时,您必须重新打开该类(如下所示),这样它才能工作,您不能将它包含在初始声明中(至少从我所看到的示例和我自己的经验)。importEmberfrom'ember';constcomponent=Ember.Component.extend({});component.reopenClass({positionalParams:['post'],});exportdefaultcomponent;如果你在单个声明中这样做(如下所示)它将不起作用importEmberfrom'ember';exportdefaultEmber.Component.exte

  10. javascript - 在 React Native 中查看组件层次结构 - 2

    调试React网站时,我可以使用ReactDeveloperTools查看组件层次结构:我如何在ReactNative中做同样的事情?rageshake菜单包含一个“检查器”,但它似乎只能让我通过点击它来检查单个元素-我看不到任何浏览完整组件层次结构的方法。 最佳答案 不幸的是,从react-native0.12版本开始,Devtools的“React”选项卡不再起作用。这是aknownissue.有一个quiteactivediscussiononGithub已经开放了一段时间,但还没有解决方案。更新Devtools“React”

随机推荐