【Android】Jetpack组件之LifeCycle

server/2024/10/15 11:14:52/

引言

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

使用Lifecycle解耦页面与组件

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

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

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

java">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 时使用,以确保计时器的连续性

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

java">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 事件)时,这个方法会被调用,使用注解来明确调用的时间

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

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

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

使用LifecycleService解耦Service组件

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

我们需要先导入依赖:

在这里插入图片描述

也可以直接使用快捷键F4

在这里插入图片描述

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

在这里插入图片描述

点击OK就导入成功了!

接下开看看如何使用吧

  1. 创建 LifecycleService 子类:首先,你需要创建一个继承自 LifecycleService 的类。这将是你的服务类,你可以在这里定义服务的行为。
java">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 注解来标记方法,这些方法将在特定的生命周期事件发生时被调用。
java">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
java">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
java">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.ppmy.cn/server/124881.html

相关文章

常见电脑品牌BIOS设置与进入启动项快捷键

常见电脑品牌BIOS与引导项快捷键速查表 | 电脑品牌 | BIOS快捷键 | 引导项快捷键 | 备注 ||------------|------------|--------------|------------------------------ || 联想 | F2/F1 | F12 | 笔记本通常为F2&#xff0c;台式机通常为F1 || IBM/ThinkPad | F1 | 未知 | ||…

1.1.4 计算机网络的分类

按分布范围分类&#xff1a; 广域网&#xff08;wan&#xff09; 城域网&#xff08;man&#xff09; 局域网&#xff08;lan&#xff09; 个域网&#xff08;pan&#xff09; 注意&#xff1a;如今局域网几乎采用“以太网技术实现”&#xff0c;因此“以太网”几乎成了“局域…

UDS_5_输入输出控制功能单元

目录 一. 0x2F服务 一. 0x2F服务 InputOutputControlByIdentifier(0x2F)服务 用于替换服务器输入信号的值或内部功能控制电子系统的某个输出(执行器) •请求报文 A_Data Byte Parameter Name Cvt Byte Value #1 InputOutputControlByIdentifier Request SID M 0x2F dataI…

人员账号所属权限模块

select distinct a.编码 as 部门编号, a.名称 部门, B.编号 as 人员编号, b.姓名, d.用户名, substr(t.角色, 4, 20) as 角色,t.标题, t.说明,t.功能 from 部门表 a, 人员表 b, 部门人员 c, 上机人员表 d, …

超详细超实用!!!AI编程之cursor编写设计模式迪米特法则实例(八)

云风网 云风笔记 云风知识库 一、设计模式迪米特法则定义 只与你的直接朋友交谈&#xff0c;不跟“陌生人”说话 其含义是&#xff1a;如果两个软件实体无须直接通信&#xff0c;那么就不应当发生直接的相互调用&#xff0c;可以通过第三方转发该调用。其目的是降低类之间的耦…

一款以MM32SPIN0230为核的智能功率模块

MM32SPIN0230是一款极具竞争力的高性价比单电机控制MCU&#xff0c;搭载Cortex-M0内核&#xff0c;32KB Flash、4KB SRAM&#xff0c;集成了运动控制所需的12位高精度ADC、2路模拟比较器COMP和2路运算放大器OPAMP&#xff0c;另配备有MC-TIM、硬件除法器HW-Div、DMA控制器等专用…

常用大语言模型简单介绍

LLaMA&#xff08;Large Language Model Meta AI&#xff09;和 Qwen是两个不同的大语言模型&#xff0c;它们在开发背景、设计目标和使用场景等方面有所不同。 1. LLaMA: 开发背景: LLaMA 是由Facebook开发的大语言模型&#xff0c;主要针对学术研究和开源领域。它的设计初衷…

微信小程序 蓝牙通讯

客户的需求如下&#xff1a;通过微信小程序控制蓝牙ble设备(电子面膜)&#xff0c;通过不同指令控制面膜的亮度和时间。 01.首先看下客户的ble设备服务文档&#xff1a;(本部分需要有点蓝牙基础,在调试过程中可以用安卓软件nRF Connect软件来执行测试命令) 0xFFF1灯控命令 命…