Jetpack 架构组件之 Lifecycle (一)起源

RK3572-Android16-记录一次OTA升级失败解决方案 这里记录一次解决RK3576 Android16 OTA 用Recovery 升级失败的一次解决案例,将部分经验作为总结。本次OTA升级耗时了几天,最终是RK给出的解决方案,再加上经验来解决了其它部分问题新平台,高一点的Android版本,可能本身有bug,多请教平台来,不要蒙着干,干不出来的。 阅读详情

此事件回调中这样写:

class ContentActivity : AppCompatActivity(), UnderLineWordCallBack {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        ContentPlayer.prepare(this)
    }
    
	//当前Activity的划词播放后回调这里
    override fun callback(content: String) {
    	//	开始播放
        ContentPlayer.play(content)
    }

}

这样这个功能就做完了。真的做完了吗?如果你的Leader看到这样的代码,怕不是第二天让你卷铺盖走人~(开玩笑的开玩笑的)

这样的代码可能会发生 内存泄漏 :
假设客户划了一段很长的英语文章,然后点击播放,播放到一半客户不想听了,直接点击了返回键后,播放器还持有着 ContentActivity的引用,在播放器继续播放的过程中,ContentActivity是无法被gc的,这就会出现了问题

所以我们还需要准备一个unAttach()方法。最终的方案如下:

object ContentPlayer{

    fun play(content: String) {
        //调用系统播放器播放
    }

    fun prepare(context: Context) {
        //播放器的准备工作
    }
    
    fun unAttach() {
        //释放当前持有的Activity资源    
    }
}
class ContentActivity : AppCompatActivity(), UnderLineWordCallBack {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        //准备播放器资源
        ContentPlayer.prepare(this)
    }
    
	//当前Activity的划词播放后回调这里
    override fun callback(content: String) {
    	//	开始播放
        ContentPlayer.play(content)
    }
    
    override fun onDestory() {
        ...
        //	释放资源
        ContentPlayer.unAttach()
    }

}

上面这样的代码当然没有问题了,可以正常使用,我们还严谨地保护了App不发生内存泄漏,值得表扬!

但是还有问题:

  • 无法保证调用一致性,在多人协作开发时存在很大的隐患
  • 调用不够优雅
  • 代码侵入性太强

如果当前App有很多的Activity要用到划词播放这个功能,那么我们就需要在每一个Activity中重复上面的代码,当代码量上来之后,会很容易遗忘调用unAttach方法,而且一个项目不可能是之后一个人完成,往往是协作开发,如果别人写的界面想要调用你写的ContentPlayer,除非你写了很详细的注释,否则必须深入源码,才知道在Activity的onDestory处去释放资源。

更优雅,更安全的写法,就是利用Lifecycle组件

Lifecycle的出现如何解决问题

在进一步使用Lifecycle优化上述代码之前,先看一下Lifecycle的官方定义:

生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。

也就是说,我们写代码中开发的某个组件需要去感知生命周期时,要首先想到使用Lifecycle。

可以让我们在组件内部来监听到生命周期,就像这样:

object ContentPlayer : LifecycleObserver{

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun prepare(context: Context) {
        //播放器的准备工作
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun unAttach() {
        //释放当前持有的Activity资源
    }
}

通过方法注解,决定当前方法被调用的时机。之后在需要使用ContentPlayer的Activity中去注册观察者

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //	一行代码搞定
        lifecycle.addObserver(ContentPlayer)
    }

用到划词播放的界面只需通过一行代码,lifecycle.addObserver(ContentPlayer)注册lifecycle观察者。完美解决了调用一致性和代码侵入性太强的问题。

Lifecycle给其他Jectpack相关组件铺路

Lifecycle除了给我们开发者使用之外,在Android源码很 Lifecycle组件是Google Jectpack架构的基础,Jectpack的组件:databing、viewmodel等等都依赖于lifecycle对生命周期的感知,所以我认为在学习jectpack和MVVM之前,需要先了解一下Lifecycle的使用和 基本实现原理

底层原理+项目实战+面试专题

点击即可领取 Android进阶、架构设计、NDK、跨平台、底层源码,面试资料,Flutter源码解析资料

(包含Android技能图谱+开源框架源码+视频解析+大厂面试题)

实战:RK3568 Android14 集成 AP6212A WiFi/BT 二合一模块 AP6212A 的集成在 RK3568 上非常成熟。只要电源、32K 时钟、SDIO 线序、UART 流控这四点硬件没问题,软件上主要是 DTS 对应的 GPIO 别填错即可。希望这篇博文能帮你一次点亮 WiFi 和蓝牙! 阅读详情

相关推荐

Anomalib实战:5分钟搞定图像异常检测模型训练(附完整代码)

本文提供了一份基于Anomalib框架的图像异常检测快速实战指南。文章详细介绍了从环境搭建、数据准备到模型训练与推理的完整流程,重点推荐了训练速度快、效果稳定的PatchCore模型,并附带了可运行的完整代码,旨在帮助开发者快速上手工业质检等实际应用。

weixin_29039773的博客 422

Android Jetpack 架构组件之 Lifecycle (一)起源

Lifecycle的存在意义 文章开头先来引入一个 业务案例 这是一个学习英语的App,部分页面支持 划词播放 如何可以优雅得实现这个真实的业务场景呢? 首先需要定义一个全局单例的播放器,播放器有一个方法play(val content: String) object ContentPlayer { fun play(content: String) { //调用系统播放器播放 } fun prepare(context: Context)

qq_43747542的博客 258

从零构建锂电池主动均衡系统:Simulink仿真中的Buck-Boost拓扑实战指南

本文详细介绍了如何在Simulink中从零构建基于Buck-Boost拓扑的锂电池主动均衡系统。通过仿真环境搭建、参数优化、控制策略设计和性能评估,为工程师提供了完整的实战指南,帮助快速验证和优化均衡算法,提升电池组一致性与寿命。

gitlab7runner的博客 897

Jetpack 架构组件之 Lifecycle (三) 原理

Android Jetpack 架构组件之 Lifecycle (一)起源 Android Jetpack 架构组件之 Lifecycle (二)使用 Lifecycle 实现原理分析 所有源码基于Lifecycle最新版本 v2.2.0 Lifecycle 的源码内容不多,非常轻量。 Lifecycle 的核心设计模式就是观察者模式, 通过Lifecycle 的方法:addObserver(LifecycleObserver observer) 也可以看出来。 一个非常有趣的地方是Lifec

Androidbye的博客 561

ComfyUI-Impact-Subpack插件安装避坑指南:为什么你的UltralyticsDetectorProvider节点还是找不到?

本文深入解析了ComfyUI-Impact-Subpack插件的安装与排障问题,特别是针对UltralyticsDetectorProvider节点缺失的常见问题提供了详细的解决方案。从底层机制到高阶应用,涵盖了手动安装、模型配置、性能优化等关键步骤,帮助用户彻底解决插件依赖关系断裂问题。

Jerry的专栏 1152

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

Android Jetpack 架构组件之 Lifecycle (二) 使用

Lifecycle 使用 在 上篇文章 Lifecycle(一) 起源中已经通过一个例子让大家简单的认识到: 将依赖于生命周期的代码直接写在Activity 或 Fragment 会导致代码条理性很差并且会扩散错误。 通过Lifecycle可以将依赖组件的代码从生命周期方法移入组件本身中。 也就是说,组件内部可以感知到Activity 或者Fragment的生命周期 这篇文章具体展开说一下Lifecycle 的用法 预备知识 Lifecycle 中的事件和状态 Lifecycle 通过两个枚举类型:Ev

qq_43747542的博客 239

YOLOv13-SWC (ShiftWise Convolution) 完整移植与原理深度解析教程

YOLOv13-SWC模型移植与原理解析 本文详细介绍了YOLOv13-SWC模型的完整移植过程与核心技术原理。YOLOv13-SWC在YOLOv8架构基础上引入ShiftWise Convolution(SWC)模块,通过创新性的位移操作、重参数化大核卷积和LoRA分解技术,显著提升了模型性能。文章包含三个核心部分: 模型移植实现:包括配置文件创建、任务模块修改和核心代码实现,重点介绍了SWC模块的掩码机制和LoRA卷积分解策略。 ShiftWise操作原理:深入解析了将大核卷积分解为小核卷积位移组合的数

FJN110的博客 504

Jetpack 架构组件之 Lifecycle (二) 使用

Android Jetpack 架构组件之 Lifecycle (一)起源 Lifecycle 使用 在 上篇文章Lifecycle(一) 起源中已经通过一个例子让大家简单的认识到: 将依赖于生命周期的代码直接写在Activity或Fragment会导致代码条理性很差并且会扩散错误。 通过Lifecycle可以将依赖组件的代码从生命周期方法移入组件本身中。 也就是说,组件内部可以感知到Activity或者Fragment的生命周期 这篇文章具体展开说一下Lifecycle 的用法 ...

Androidbye的博客 571

物联网与人工智能项目实战:构建智能农业监控系统

智能农业监控系统通过物联网技术实时监测农业环境中的各项数据(如土壤湿度、温度、光照强度等),并利用人工智能技术分析和预测农业生产的趋势,进而为农民提供决策支持。系统的核心目标是提高农作物的产量和品质,同时减少资源浪费,优化农田管理。环境监测:实时采集农田的温湿度、土壤湿度、光照等环境数据。作物生长监测:通过传感器和图像识别技术监测作物的生长状况。智能灌溉系统:根据土壤湿度和气候条件自动调整灌溉量。病虫害检测与预警:利用人工智能和图像识别技术自动检测作物病虫害,并及时给出预警。数据分析与决策支持。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 709

ADS基础教程12 - 参数扫描

在硬件设计、仿真以及调试阶段,很多时候需要找到一个合理的参数来使设计处于最优状态。前面所讲的调优方式是其中的最直接的手段。因此,本文将介绍ADS中如何指定元器件的参数为变量,并可以对变量设置相应的约束条件,来实现的变量进行多组参数的仿真结果的展示。在图形显示界面,添加一个Plot,并添加参数结果。此时,结果中会显示出所有的扫描结果。参数扫描的要素包含:新建变量、变量参数设置、扫描模型设置三个方面。如果找不到该图标,在菜单栏单击右键,弹出的对话框将。,弹出的选项卡中,将添加两个变量。点击菜单栏的仿真按钮。

XZ_ZC的博客 8158

MVVM下的Jetpack核心组件

Jetpack架构组件及 “标准化开发模式” 确立,意味着Android开发已步入成熟阶段,只有对MVVM确有深入理解,才能自然而然写出标准化、规范化代码。本次笔者会浅入浅出的介绍以下内容,由于它是一个我的学习总结记录,所以比较适合对MVVM如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

bugyinyin的博客 476

整车电检工艺流程

本文是笔者在从事汽车行业智能制造领域过程,对于整车电检工艺流程的理解与总结。

qq_40664711的博客 1万+

Andriod ---【JetPack篇】初识 JetPack

一、JetPack出现的原因 App架构设计的标准的缺失,我们所用过的MVC、MVP、MVVM系列模式可能都是根据自己项目的场景构建的,而并不符合Google的设计方案,所以Google推出Android架构设计标准JetPack。 二、什么叫JetPack 简单一句话概括:JetPack 是一个由多个库组成的套件,可以帮助开发者遵循最佳做法,减少样板代码编写,可在各种Android版本和设备中一直运行代码,让开发者集中精力编写重要的代码,看下面的图: 三、为什么使用JetPack 1..

梁同学与Android 3143

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问

延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。

Easyhood的博客 288

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存

二十多个模块业务高度相似却各有差异,核心矛盾在于“统一与灵活”的平衡。通过角色接口组合(如IProjectAware、IVoiceAware)实现能力按需注入,新增功能零侵入;用模板方法锁定生命周期流程,确保顺序一致;结合@CallSuper与工厂方法,既约束关键逻辑,又保留子类自由。最终实现:骨架统一、填空自由,管得住业务,又不侵入业务。

mmsx990的博客 397

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android 开发入门实践(十三):用 Intent、UiState 和 Reducer 理解 MVI 的状态更新

本文记录第141—145课对MVI架构的入门实践,通过“返回列表”功能逐步构建意图(NewsIntent)、状态(NewsUiState)与状态转换(reduce)机制。基于单向数据流,用户操作生成意图,ViewModel通过Reducer根据旧状态计算新状态,并通过StateFlow更新Compose界面。代码实现清晰分离关注点,强化了对状态管理、事件驱动与数据流的理解。

Easyhood的博客 324

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 201

安卓部署Linux性能实测:一颗移动处理器,能否胜任日常 Linux 开发?

本文通过在一加Ace5上部署NimoteCode的ARM64 Linux环境,测试了其在CoreMark、SQLite编译及并行构建中的表现。结果显示,尽管单核性能约2.34GHz,多核扩展比达6.15×,但优化编译耗时仍高达35秒,反映移动处理器虽具备一定开发能力,却受限于文件系统开销与运行环境(如PRoot)。实际开发中,非优化构建效率较高,而并行编译可显著提速。结论:安卓手机可作为轻量级开发辅助工具,但无法替代桌面环境,真正价值在于便携性与即时响应,而非全功能替代。

一个不知名码农的专栏 322

Android 17 全栈性能分析关键字与源码手册

FrameTimeline 找异常帧,ATrace 找阶段,thread_state 找等待类型,ftrace 找内核原因,Simpleperf 找 CPU 热点,驱动源码找最终触发条件;任何根因结论都必须回到同一对象、同一时间窗口和同一条依赖链。

weixin_43228946的博客 371

CTF 命令执行题学习笔记:终端特殊字符 $IFS 与 %09 的用法(HelloCTF RCE-labs)

空格被过滤时:用%09(TAB)或$IFS代替空格关键词被过滤时:用通配符?或字符类[f]拼出被禁的词,让 WAF 在原始字符串里看不到它,shell 在执行时再展开这类技巧在后续的命令执行题里会反复用到,建议亲手在靶机上敲一遍感受一下。

YY888888_的博客 542

Android 开发入门实践(九):把新闻数据与页面状态交给 ViewModel

本文记录第110—117课学习成果:将页面标题、新闻列表及选中编号逐步迁移至NewsViewModel,通过ViewModelProvider获取实例并读取数据。页面调用ViewModel方法处理选择与返回,实现状态管理解耦。过程中纠正了对Activity重建机制的误解,并厘清mutableStateOf的可观察性与ViewModel对象生命周期的区别,深化了对Compose状态更新机制的理解。

Easyhood的博客 220

云手机私有化部署完整方案:基于ARM服务器搭建私有安卓云集群

ARM 服务器是私有化安卓云集群最优硬件底座,原生架构匹配 Android,高密度、低损耗,非常适合企业内网场景。整套私有化方案的核心,从来不是 “跑起来安卓”,而是隔离可控、可审计、可运维、可扩容。两条路线各有取舍:开源自建灵活、门槛高;商用私有化交付开箱即用、安全能力完备,是当前企业生产环境主流方案。六边云手机私有化方案,补齐了自建方案在驱动适配、管控平台、审计合规、信创适配上的短板,适合对数据主权、内网隔离有强需求的政企、自研 App、垂直行业客户。

a598652的博客 332

Android 顶点上传:Heap 到 Direct 的零拷贝,省的是 JNI 次数

一帧数十万次putFloat的性能瓶颈源于频繁跨JNI边界,每次开销远超传输字节数。通过将写入与上传解耦:用堆内ByteBuffer高速写入,最后一次性put(writeBuf)批量传至堆外DirectByteBuffer,将数百万次边界调用压缩为一次,实现近10倍性能提升。关键在于复用堆外缓冲区、统一端序,并结合“更新-绘制”分离,仅在数据变更时上传顶点,平移缩放时零开销重绘,彻底释放CPU瓶颈。

mmsx990的博客 478

谷歌相机9.2下载(GCam 安卓通用版 安装与使用说明)

谷歌相机9.2版移植自Pixel原生相机,支持Camera2 API的Android 10+设备安装,凭借多帧合成技术在夜景、HDR+与人像模式表现优异。可提升暗光画质、优化动态范围与背景虚化效果,支持视频防抖及配置文件自定义。安装需确认机型兼容性,建议备份原相机,避免冲突。资源可通过kuake链接获取,仅限学习测试使用。

2611_96675819的博客 157

Android 系统启动与调试中的日志抓取方式全解析

│ 用户操作/系统事件 ││ │▼ ▼│ (驱动/硬件/内存管理) │ │ (App/SystemServer) ││ │ │ ││ │▼ ▼│ dmesg 命令 │ │ logd daemon ││ cat /proc/kmsg │ │ (分类存储到分区) ││ │▼ ▼│ 串口 UART │ │ logcat 命令 ││ (硬件直连,最早输出) │ │ adb logcat ││ │▼│ (汇总所有日志+系统状态) │工具最佳用途关键优势主要局限dmesg。

zhaoshuzhaoshu的专栏 265
上一篇: 聊聊我的2020年面经,六家大厂面经,四连斩!
下一篇: Jetpack 架构组件之 Lifecycle (二) 使用
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值