【Android】Jetpack组件之LifeCycle

引言

Lifecycle组件是Android Jetpack架构组件之一,它提供了一种方法来管理Android组件(如Activity、Fragment和服务)的生命周期。Lifecycle组件帮助你执行与生命周期相关联的操作,确保在适当的时间发生适当的事情,例如,当你的应用进入后台时停止数据刷新,或者在应用回到前台时更新UI。

使用Lifecycle解耦页面与组件

Lifecycle 组件提供了一种方法来处理 Android 组件(如 Activity 和 Fragment)的生命周期。在 MVVM 架构中,Lifecycle 组件可以帮助 ViewModel 感知宿主的生命周期状态,从而在适当的时机进行数据加载或资源清理。

介绍一个控件:Chronometer是 Android 提供的一个用于显示计时器的 UI 控件。它继承自 View 类,专门用于展示和跟踪时间的流逝。Chronometer 控件不仅可以显示经过的时间,还可以在时间变化时提供格式化的文本显示,并且可以响应用户的开始、暂停和重置等操作

我们就使用这个控件来体验Lifecycle的作用,在活动当中放置一个Chronometer控件用来计算我们使用这个程序多长时间,按照之前所学的我们会在活动的回调函数当中写代码

public class MainActivity extends AppCompatActivity {Chronometer chronometer;long l;@Overrideprotected void onCreate(Bundle savedInstanceState) {......chronometer = findViewById(R.id.chronometer);}@Overrideprotected void onResume() {super.onResume();//SystemClock.elapsedRealtime() 返回自开机以来经过的时间(以毫秒为单位),l 是之前保存的时间差值。//通过减去 l,计时器的基准时间被设置为上次暂停时的时间。chronometer.setBase(SystemClock.elapsedRealtime() - l);chronometer.start();}@Overrideprotected void onPause() {super.onPause();//后台运行计算并保存当前的时间差值。chronometer.getBase() 返回计时器的基准时间,通过计算当前时间减去基准时间,//可以得到从基准时间到当前时间经过的毫秒数,这个值被保存在 l 中,以便在下次 onResume() 时使用。l = SystemClock.elapsedRealtime() - chronometer.getBase();chronometer.stop();}
}
  • chronometer.setBase(SystemClock.elapsedRealtime() - l); 设置计时器的基底时间。这里 l 是之前保存的时间差,这样做是为了在 Activity 从 onPause 回来时,计时器能够从上次暂停的地方继续计时
  • l = SystemClock.elapsedRealtime() - chronometer.getBase(); 计算当前时间与计时器基底时间的差值,并将其保存在 l 中。这个值将在下次 onResume 时使用,以确保计时器的连续性

如何进行解耦呢?接下来就看看吧

public class MyChronomter extends Chronometer implements LifecycleObserver {private long l;public MyChronomter(Context context, AttributeSet attrs) {super(context, attrs);}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)private void startMeter() {setBase(SystemClock.elapsedRealtime() - l);start();}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)private void stopMeter() {l = SystemClock.elapsedRealtime() - getBase();stop();}
}

我们新创建了一个组件实现LifecycleObserver

LifecycleObserver 是 Android Architecture Components 中 Lifecycle 组件的一部分。它是一个接口,用于定义一个观察者,它可以观察到 LifecycleOwner 生命周期的变化

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME) 标记,这意味着当关联的 LifecycleOwner 从暂停状态恢复到前台(即 ON_RESUME 事件)时,这个方法会被调用,使用注解来明确调用的时间

代码不难理解,接下来我们就可以把主活动里面的多于代码删除了,但要为组件设置监听

getLifecycle().addObserver(chronometer); //给他设置监听

接下来运行程序就仍然实现了之前的记录下应用的使用时间,大大减少了活动里面代码的数量。

使用LifecycleService解耦Service组件

LifecycleService 是一个非常有用的组件,它允许你将后台服务(Service)与组件的生命周期解耦。这样,服务可以在不需要与特定活动(Activity)或片段(Fragment)紧密绑定的情况下运行

我们需要先导入依赖:

在这里插入图片描述

也可以直接使用快捷键F4

在这里插入图片描述

对你所要导入的依赖进行搜索与选择

在这里插入图片描述

点击OK就导入成功了!

接下开看看如何使用吧

  1. 创建 LifecycleService 子类:首先,你需要创建一个继承自 LifecycleService 的类。这将是你的服务类,你可以在这里定义服务的行为。
public class MyLocationService extends LifecycleService {public MyLocationService() {Log.d("hhhhhh","MyLocationService");MyLocationObserver observer = new MyLocationObserver(this);getLifecycle().addObserver(observer);}
}

我们定义了一个服务,并为其设置监听

  1. 注册 LifecycleObserver:在你的 LifecycleService 子类中,你需要注册一个或多个 LifecycleObserver。这些观察者将监听生命周期事件,并在事件发生时执行相应的操作。
  2. 处理生命周期事件:在 LifecycleObserver 中,你可以使用 @OnLifecycleEvent 注解来标记方法,这些方法将在特定的生命周期事件发生时被调用。
public class MyLocationObserver implements LifecycleObserver {private Context context;private LocationManager locationManager;private MyLocationListener listener;public MyLocationObserver(Context context) {this.context = context;}@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)private void startGetLocation() {Log.d("hhhhhh","startGetLocation");locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);listener = new MyLocationListener();if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {return;}locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 300,1, listener);}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)private void stopGetLocation() {Log.d("hhhhhh","stopGetLocation");locationManager.removeUpdates(listener);}static class MyLocationListener implements LocationListener {@Overridepublic void onLocationChanged(@NonNull Location location) {Log.d("hhhhhh","LocationChanged" + location.toString());}}
}

上面的注解就无需再做过多的解释了,在上面解耦页面的时候就已经介绍过了,对部分不熟悉的代码进行简单介绍吧:

  • locationManager.requestLocationUpdates:这个方法请求位置更新,指定使用 GPS_PROVIDER,设置更新的时间间隔为 300 毫秒,水平精度为 1 米,并将 listener 作为回调。
  • locationManager.removeUpdates(listener):当不再需要位置更新时,这个方法将停止位置更新,以避免不必要的资源消耗和电池使用。
  1. 在清单文件中注册服务:最后,你需要在Android项目的清单文件(AndroidManifest.xml)中注册你的 LifecycleService
<serviceandroid:name=".MyLocationService"android:enabled="true"android:exported="true"></service>

接下来运行程序,当我们按下开始按钮再按下结束按钮,此时观察打印日志:

在这里插入图片描述

使用ProcessLifecycleOwner监听应用程序生命周期

我们先来看看如何使用吧

  1. 创建 LifecycleObserver
public class MyApplicationObserve implements LifecycleObserver {private static String TAG = "hhhhhh";@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)private void onCreate() {Log.d(TAG, "onCreate");}@OnLifecycleEvent(Lifecycle.Event.ON_START)private void onStart() {Log.d(TAG, "onStart");}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)private void onResume() {Log.d(TAG, "onResume");}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)private void onPause() {Log.d(TAG, "onPause");}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)private void onStop() {Log.d(TAG, "onStop");}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)private void onDestroy() {Log.d(TAG, "onDestroy");}
}
  1. 注册 LifecycleObserver
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();ProcessLifecycleOwner.get().getLifecycle().addObserver(new MyApplicationObserve());}
}
  • ProcessLifecycleOwner.get().getLifecycle() 通过 ProcessLifecycleOwner 的单例实例获取整个应用程序进程的 Lifecycle 对象。
  • addObserver(new MyApplicationObserve())Lifecycle 对象添加一个新的观察者 MyApplicationObserve。当应用程序的生命周期发生变化时,这个观察者将收到通

<application android:name=".MyApplication"> 这行代码位于 AndroidManifest.xml 文件中,它指定了 MyApplication 作为应用程序的入口类

使用 ProcessLifecycleOwner 时需要注意以下几点:

  • ON_CREATE 事件只会被分发一次,即应用程序启动时。
  • ON_DESTROY 事件永远不会被分发,因为进程的生命周期直到进程被系统终止才会结束。
  • ON_START, ON_RESUME, ON_PAUSE, ON_STOP 事件会随着活动的生命周期变化而分发,但可能会有延迟,因为系统要确保不会因为活动的配置更改(如屏幕旋转)而重复发送这些事件。

接下来运行程序,我们推到后台一次,再进去最后停止运行程序:

在这里插入图片描述

文章到这里就结束了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习项目----用LSTM模型预测股价(包含LSTM网络简介,代码数据均可下载)

前言 前几天在看论文&#xff0c;打算复现&#xff0c;论文用到了LSTM&#xff0c;故这一篇文章是小编学LSTM模型的学习笔记&#xff1b;LSTM感觉很复杂&#xff0c;但是结合代码构建神经网络&#xff0c;又感觉还行&#xff1b;本次学习的案例数据来源于GitHub&#xff0c;在…

越差越好?为什么简单反而赢了,这背后究竟有什么秘诀?

你有没有发现,软件界里那些最成功的产品,往往并不是最复杂、最强大的?我们用的很多东西,看起来功能普通,甚至有些粗糙,但就是这样简陋的设计,反而成了市场上的赢家。 也许你玩过Flappy Bird这个游戏:它的设计非常简单,玩家只需要点击屏幕让小鸟飞行,避开管道障碍。游…

Llama 3.2 智能代理开发教程

构建研究代理可能很复杂&#xff0c;但使用 LangChain 和 Ollama&#xff0c;它会变得更加简单和模块化。 在本教程中&#xff0c;我们将向你展示如何基于Llama 3.2创建一个研究代理&#xff0c;该代理可以路由查询、执行网络搜索并使用工作流和 LLM 的组合生成详细响应。最后…

出栈入栈次序匹配

学习栈的过程中&#xff0c;我们一定见过下面两题&#xff0c;在当时我们可能费尽心思才找出不可能的一个出栈序列&#xff0c;但是如果进栈元素很多&#xff0c;那么找出出栈序列时4&#xff0c;头发就要掉光了&#xff01;那么我们是否可以实现一串代码&#xff0c;来帮助我们…

MySQL 篇-深入了解视图、SQL 优化(主键优化、order by 优化、group by 优化、update 优化等)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 SQL 优化 1.1 SQL 优化 - 插入数据 1.2 SQL 优化 - 主键优化 1.2.1 页分裂 1.2.2 页合并 1.2.3 主键设计原则 1.3 SQL 优化 - order by 优化 1.3.1 单字段排序 1.…

重学SpringBoot3-集成Redis(五)之布隆过滤器

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;五&#xff09;之布隆过滤器 1. 什么是布隆过滤器&#xff1f;基本概念适用场景 2. 使用 Redis 实现布隆过滤器项目依赖Redis 配置…

【python实操】python小程序之对象的属性操作

引言 python小程序之对象的属性操作 文章目录 引言一、对象的属性操作1.1 题目1.2 代码1.3 代码解释 二、思考2.1 添加属性2.2 获取属性 一、对象的属性操作 1.1 题目 给对象添加属性 1.2 代码 class Cat:# 在缩进中书写⽅法def eat(self):# self 会⾃动出现,暂不管print(f…

【前端开发入门】前端开发环境配置

目录 引言一、Vscode编辑器安装1. 软件下载2. 软件安装3. 插件安装 二、Nodejs环境安装及版本控制1. 安装内容2. 使用nvm安装2.1 软件下载并安装2.2 nvm基本指令2.3 nvm下载过慢导致超时解决 三、git安装及配置1. 软件下载2. 软件安装3. 基础配置 四、总结 引言 本系列教程旨在…

知识图谱入门——5:Neo4j Desktop安装和使用手册(小白向:Cypher 查询语言:逐步教程!Neo4j 优缺点分析)

Neo4j简介 Neo4j 是一个基于图结构的 NoSQL 数据库&#xff0c;专门用于存储、查询和管理图形数据。它的核心思想是使用节点、关系和属性来描述数据。图数据库非常适合那些需要处理复杂关系的数据集&#xff0c;如社交网络、推荐系统、知识图谱等领域。 与传统的关系型数据库…

【韩顺平Java笔记】第7章:面向对象编程(基础部分)【227-261】

文章目录 227. 重载介绍228. 重载快速入门229. 重载使用细节230. 重载课堂练习1231. 232. 重载课堂练习2,3233. 可变参数使用233.1 基本概念233.2 基本语法233.3 快速入门案例 234. 可变参数细节235. 可变参数练习236. 作用域基本使用237. 作用域使用细节1238. 作用域使用细节2…

基于FPGA的ov5640摄像头图像采集(二)

之前讲过ov5640摄像头图像采集&#xff0c;但是只包了的摄像头驱动与数据对齐两部分&#xff0c;但是由于摄像头输入的像素时钟与HDMI输出的驱动时钟并不相同&#xff0c;所有需要利用DDR3来将像素数据进行缓存再将像素数据从DDR3中读出&#xff0c;对DDR3的读写参考米联客的IP…

Hallo部署指南

一、介绍 Hallo是由复旦大学、百度公司、苏黎世联邦理工学院和南京大学的研究人员共同提出的一个AI对口型肖像图像动画技术&#xff0c;可基于语音音频输入来驱动生成逼真且动态的肖像图像视频。 该框架采用了基于扩散的生成模型和分层音频驱动视觉合成模块&#xff0c;提高了…

独立站如何批量查收录,独立站批量查询收录的操作方法

独立站批量查询收录是SEO优化过程中的一项重要任务&#xff0c;它有助于网站管理员全面了解网站在搜索引擎中的表现情况。以下是一些常用的独立站批量查询收录的操作方法&#xff1a; 一、使用搜索引擎的Site指令结合自动化工具 编写脚本或配置爬虫&#xff1a; 利用Python、…

【Flutter】- 核心语法

文章目录 知识回顾前言源码分析1. 有状态组件2. 无状态组件3. 组件生命周期4. 常用组件Container组件Text组件Image组件布局组件row colum stack expandedElevntButton按钮拓展知识总结知识回顾 【Flutter】- 基础语法 前言 Flutter是以组件化的思想构建客户端页面的,类似于…

windows C++-创建数据流代理(二)

完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络&#xff1a; 由于 run 方法是在一个单独的线程上调用的&#xff0c;因此在完全连接网络之前&#xff0c;其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象&#xff0c;用于缓冲…

网站建设中常见的网站后台开发语言有哪几种,各自优缺点都是什么?

市场上常见的网站后台开发语言有PHP、Python、JavaScript、Ruby、Java和.NET等。这些语言各有其独特的优缺点&#xff0c;适用于不同的开发场景和需求。以下是对这些语言的具体介绍&#xff1a; PHP 优点&#xff1a;PHP是一种广泛用于Web开发的动态脚本语言&#xff0c;特别适…

Diffusion models(扩散模型) 是怎么工作的

前言 给一个提示词, Midjourney, Stable Diffusion 和 DALL-E 可以生成很好看的图片&#xff0c;那么它们是怎么工作的呢&#xff1f;它们都用了 Diffusion models&#xff08;扩散模型&#xff09; 这项技术。 Diffusion models 正在成为生命科学等领域的一项尖端技术&…

基于STM32的智能花盆浇水系统设计

引言 本项目设计了一个基于STM32的智能花盆浇水系统。该系统通过土壤湿度传感器检测土壤湿度&#xff0c;当湿度低于设定阈值时&#xff0c;自动启动水泵进行浇水。它还结合了温湿度传感器用于环境监测。该项目展示了STM32在传感器集成、自动控制和节水智能化应用中的作用。 …

Nginx05-基础配置案例

零、文章目录 Nginx05-基础配置案例 1、案例需求 &#xff08;1&#xff09;有如下访问 http://192.168.119.161:8081/server1/location1 访问的是&#xff1a;index_sr1_location1.htmlhttp://192.168.119.161:8081/server1/location2 访问的是&#xff1a;index_sr1_loca…

YoloV9改进策略:BackBone改进|CAFormer在YoloV9中的创新应用,显著提升目标检测性能

摘要 在目标检测领域,模型性能的提升一直是研究者和开发者们关注的重点。近期,我们尝试将CAFormer模块引入YoloV9模型中,以替换其原有的主干网络,这一创新性的改进带来了显著的性能提升。 CAFormer,作为MetaFormer框架下的一个变体,结合了深度可分离卷积和普通自注意力…