前言
Jetpack是当下最火的组件了,Google官方大力推荐,其好用,性能优异受到很多开发者的喜爱,接下来我们将简单了解一下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实现类 -
数据库框架的两种实现思路:
-
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
|