当前位置: 首页 > news >正文

记录JetPack组件用法及原理

目录

Lifcycle

使用方法:

LifecycleOwner

Lifecycle

LifecycleObserver

事件分发

 解耦优势

面试官:你了解jetPack组件吗?比如Lifecycle


现在距离下班还有两个半小时;估计无法梳理记录完整,没记录完,明天继续~ 就是这么努力

JetPack 是一套Andorid组件库,帮助开发者更容易,快速开发高质量应用。它包括架构组件、UI组件、行为组件等;

  • Lifcycle :生命周期管理
  • Livedata: 响应式数据持有
  • ViewModel:数据与UI分离
  • Room:数据库访问
  • Navigation: 页面导航
  • paging:分页加载
  • WorkManger:后台任务管理
  • DataBinding :控件绑定
  • CameraX:相机
  • Constrainlayout:约束布局

Lifcycle

使用方法:

1、添加依赖

implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.7.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" // 有些功能

2、让类感知生命周期

方式一:实现LifecycleObserver (推荐 DefaultLifecycleObserver)

class MyObserver : DefaultLifecycleObserver {override fun onStart(owner: LifecycleOwner) {// 组件开始时的操作}override fun onStop(owner: LifecycleOwner) {// 组件停止时的操作}
}// 其完整实现 @Overridepublic void onCreate(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onCreate(owner);}@Overridepublic void onStart(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onStart(owner);}@Overridepublic void onPause(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onPause(owner);}@Overridepublic void onResume(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onResume(owner);}@Overridepublic void onStop(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onStop(owner);}@Overridepublic void onDestroy(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onDestroy(owner);}

注册观察者:

// 在 Activity/Fragment 中
lifecycle.addObserver(MyObserver())

方式二:直接获取生命周期状态

if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {// Do something
}

二:原理

LifecycleOwner

  • 所有支持 Jetpack Lifecycle 的组件(如 Activity、Fragment)都实现了 LifecycleOwner 接口,拥有一个 Lifecycle 实例。

Lifecycle

  • Lifecycle 用于管理生命周期状态(如 CREATED、STARTED、RESUMED、DESTROYED)。
  • 内部有状态机,随着组件经历生命周期方法(如 onStart/onStop),状态会变更,并通知所有注册的观察者。

LifecycleObserver

  • 你写的观察者(Observer)实现接口(如 DefaultLifecycleObserver),通过 @OnLifecycleEvent 或方法重载响应生命周期变化。

事件分发

  • 当 Activity/Fragment 生命周期发生变化时,框架会自动调用 LifecycleRegistry 的事件分发方法,将事件传递给所有 Observer。

 解耦优势

  • 这样可以让一些通用逻辑(如定位、传感器、网络监听等)独立成模块,自动感知生命周期,无需在 Activity/Fragment 里写重复的 onStart/onStop。

行了、我承认上述都是我粘贴拷贝的;源码我也去温习了一遍,说实在Lifecycle给我的感觉更像是一个消息总站的设计。

class LifecycleRegistry extends Lifecycle {private State mState;private Map<LifecycleObserver, ObserverWithState> mObserverMap;@Overridepublic void addObserver(LifecycleObserver observer) {// 封装 observerObserverWithState statefulObserver = new ObserverWithState(observer, mState);mObserverMap.put(observer, statefulObserver);// 立即分发当前状态sync();}void handleLifecycleEvent(Event event) {mState = getStateAfter(event); // 状态迁移sync(); // 分发给所有 observer}private void sync() {for (ObserverWithState observer : mObserverMap.values()) {observer.dispatchEvent(mState); // 分发事件}}
}

这些算是关键性源码了,看明白了吗? mObserverMap保存每个注册的observer,当然状态发生变化的时候,sync 经过一些列的查重倒序 分发给注册的Observer;dispatchEvent对应的就是回调的具体状态。

面试官:你了解jetPack组件吗?比如Lifecycle

嗯,有一点了解(谦虚永远都不会错) 比如Lifecycle 是Jetpack架构组件基础能力,它用于感知和管理Fragment、Activity的生命周期,让我们可以更优雅的做资源管理和解耦。

Fragment 和Activity都实现了LifecycleOwner,内部持有一个Lifecycle对象 也就是LifecycleRegistry。而 这个对象就是做状态管理和事件分发的。它维护了当前生命周期  比如 oncreat、started ,每当组件生命周期被调用的时候,都会同步通知LifecycleRegisty状态变更。

到这里其实就是一个观察者模式的应用了,我们通过addObserver注册,LifecycleRegisty会保存在ObserverMap中,会状态变化的时候自动回调Observer对应的方法。

当然LifecycleRegistry因为是弱引用持有LIfecycleOwner,所以当界面不存在的时候,不需要我们去操心泄漏回收问题。

http://www.dtcms.com/a/331240.html

相关文章:

  • c语言中堆和栈的区别
  • Mybatis学习笔记(二)
  • Python学习-----3.基础语法(2)
  • Linux面试题及详细答案 120道(1-15)-- 基础概念
  • Linux下的软件编程——framebuffer(文件操作的应用)
  • 初识CNN01——认识CNN
  • 计算机组成原理20250814
  • 网络通信---Axios
  • 在线进销存系统高效管理网站源码搭建可二开
  • 考研408《计算机组成原理》复习笔记,第三章(7)——虚拟存储器
  • 考公VS考研,拼哪个性价比高?
  • 什么是域名抢注?域名抢注常见问题汇总
  • 图书商城小程序怎么做?实体书店如何在微信小程序上卖书?
  • 使用vllm运行智谱GLM-4.5V视觉语言模型推理服务
  • 如何使用 AI 大语言模型解决生活中的实际小事情?
  • 数据结构——线性表(链表,力扣简单篇)
  • vscode的wsl环境,ESP32驱动0.96寸oled屏幕
  • 失败存储:查看未成功的内容
  • vscode使用keil5出现变量跳转不了
  • 如何让手机访问本地服务器部署的网页?无公网IP内网主机应用,自定义外网地址,给任意网设备访问
  • 利用 Java 爬虫按图搜索 1688 商品(拍立淘)实战指南
  • 第一章 java基础
  • 手写MyBatis第17弹:ResultSetMetaData揭秘:数据库字段到Java属性的桥梁
  • 《C++》哈希表解析与实现
  • 能源行业数字化转型:边缘计算网关在油田场景的深度应用
  • Python机器学习与深度学习;Transformer模型/注意力机制/目标检测/语义分割/图神经网络/强化学习/生成式模型/自监督学习/物理信息神经网络等
  • 基于51单片机倒计时器秒表定时器数码管显示设计
  • vue+后端
  • 微服务、分布式概念-以及集群部署 vs 分布式部署
  • 容器运行时支持GPU,并使用1panel安装ollama