Jetpack架构组件_LifeCycle组件

1.LifeCycle组件 

        LifeCycle组件可以让我们自定义的类能主动感知到Activity、Fragment、Application、Service等系统组件的生命周期。

       我们以百度定位为例,我们一般在Activity生命周期的onCreate回调函数里调用自定义类LocationService的Start()方法,在onStop回调里调用LocationService的stop()方法来启动和停止定位服务。

        利用LifeCycle让LocationService作为观察者,能感知到Activity的生命周期,当activity执行到onCreate与onStop时,LocationService自动调用它内部的start()与stop()方法来启动与停止定位,而无需再在activity里写调用LocationService.start()与LocationService.stop的代码了。当然这里的被观察者自然就是activty了。

2.使用LifeCycle解耦Activity与自定义组件 

2.1关键步骤 

     step1.自定义类(自定义组件):

        (1)让自定义类(或者称作自定义组件)实现LifecycleObserver。 

        (2)在要执行的函数start()和stop()上面添加注解@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)与@OnLifecycleEvent(Lifecycle.Event.ON_STOP)。

2.2示例代码: 

        自定义类LocationService.java

package com.gaoting.lifecycleactivity;import android.util.Log;import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;/*** 封装了定位的开启和停止*/
public class LocationService implements LifecycleObserver {String TAG = "LocationService";/*** 开始定位*/@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public void start() {Log.i(TAG, "开始定位");}/*** 停止定位*/@OnLifecycleEvent(Lifecycle.Event.ON_STOP)public void stop() {Log.i(TAG, "停止定位");}
}

        MainActivity.java

package com.gaoting.lifecycleactivity;import android.os.Bundle;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class MainActivity extends AppCompatActivity {LocationService mLocationService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mLocationService = new LocationService();getLifecycle().addObserver(mLocationService);}
}

3.使用LifeCycle解耦Service与自定义组件

3.1关键步骤 

         添加依赖:

        implementation libs.lifecycle.extensions

        step1:Service处理

        (1)让Service继承于LifecycleService

        (2)getLifecycle().addObserve()将观察者与被观察者绑定,即将自定义类与Service绑定。

        step2:自定义类的处理

        (1)实现LifecycleObserver接口。

        (2)添加标签注解事件,感知Service的生命周期。

3.2示例代码

实现Service类MyService.java。

package com.gaoting.lifecycleactivity;import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;import androidx.annotation.Nullable;
import androidx.lifecycle.LifecycleService;public class MyService extends LifecycleService {String TAG = "MyService";LocationService mlocationService;public MyService() {mlocationService = new LocationService();getLifecycle().addObserver(mlocationService);}@Overridepublic void onCreate() {Log.i(TAG, "onCreate");super.onCreate();}@Overridepublic int onStartCommand(@Nullable Intent intent, int flags, int startId) {Log.i(TAG, "onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i(TAG, "onDestroy");super.onDestroy();}}

自定义类LocationService.java。

package com.gaoting.lifecycleactivity;import android.util.Log;import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;/*** 封装了定位的开启和停止*/
public class LocationService implements LifecycleObserver {String TAG = "LocationService";/*** 开始定位*/@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public void start() {Log.i(TAG, "ON_CREATE开始定位");}/*** 停止定位*/@OnLifecycleEvent(Lifecycle.Event.ON_STOP)public void stop() {Log.i(TAG, "ON_STOP停止定位");}/*** 停止定位:用于感知Service的onDestroy生命周期*/@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)public void stopLoc() {Log.i(TAG, "ON_DESTROY停止定位");}
}

MainActivity类。

package com.gaoting.lifecycleactivity;import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.databinding.DataBindingUtil;import com.gaoting.lifecycleactivity.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {String TAG = "MainActivity";ActivityMainBinding activityMainBinding;LocationService mLocationService;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);mLocationService = new LocationService();getLifecycle().addObserver(mLocationService);/*** 启动服务*/activityMainBinding.btStartService.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent i = new Intent(MainActivity.this, MyService.class);startService(i);}});/*** 停止服务*/activityMainBinding.btStopService.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent i = new Intent(MainActivity.this, MyService.class);stopService(i);}});}@Overrideprotected void onStop() {Log.i(TAG, "onStop");super.onStop();}@Overrideprotected void onDestroy() {Log.i(TAG, "onDestroy");super.onDestroy();}
}

4.使用ProcessLifecycleOwner感知Application。

4.1关键步骤

        添加依赖:implementation libs.lifecycle.extensions。

        step1:MyApplication处理。

        (1)继承Application。

        (2)ProcessLifecycleOwner.getLifecycle().addObserver() 将观察者与被观察者绑定,即将自定义类与MyApplication绑定。

        step2.自定义类的处理

        (1)实现LIfecycleObserver接口。

        (2)添加标签注解事件,感知Application的生命周期。

4.2示例代码

        MyApplication.java。

package com.gaoting.processlifecycleapplication;import android.app.Application;import androidx.lifecycle.ProcessLifecycleOwner;public class MyApplication extends Application {ApplicationObserver mApplicationObserver;@Overridepublic void onCreate() {mApplicationObserver = new ApplicationObserver();ProcessLifecycleOwner.get().getLifecycle().addObserver(mApplicationObserver);super.onCreate();}
}

         观察者ApplicationObserver.java。

package com.gaoting.processlifecycleapplication;import android.util.Log;import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;public class ApplicationObserver implements LifecycleObserver {String TAG = "ApplicationObserver";/*** 整个应用程序只感知1次*/@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public  void onCreate(){Log.i(TAG,"ApplicationObserver.onCreate()应用程序启动");}/*** 应用程序打到前台*/@OnLifecycleEvent(Lifecycle.Event.ON_START)public  void onStart(){Log.i(TAG,"ApplicationObserver.onStart()应用程序在前台");}/*** 应用程序推到后台*/@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)public  void onResume(){Log.i(TAG,"ApplicationObserver.onResume()应用程序在前台");}/*** 应用程序推到后台*/@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)public  void onPause(){Log.i(TAG,"ApplicationObserver.onPause()应用程序退到后台");}/*** 应用程序销毁,感知不到*/@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)public  void onDestroy(){Log.i(TAG,"ApplicationObserver.onStop()应用程序销毁");}}

         AndroidManifest.xml中要增加一行:

                android:name=".MyApplication"。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:name=".MyApplication"android:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.ProcessLifecycleApplication"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

        测试,把应用启动,转入后台、回到前台等,然后观察Logcat打印日志。

               

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

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

相关文章

四川古力未来科技抖音小店:诚信之选,品质铸就信赖之路

在当今这个数字化、网络化的时代&#xff0c;电商平台如雨后春笋般涌现&#xff0c;抖音小店作为其中的佼佼者&#xff0c;以其独特的经营模式和广泛的用户基础&#xff0c;吸引了越来越多的消费者。而在这众多的抖音小店中&#xff0c;四川古力未来科技抖音小店凭借其卓越的品…

【HarmonyOS】应用屏蔽截屏和录屏

【HarmonyOS】应用屏蔽截屏和录屏 一、问题背景&#xff1a; 金融类或者高密性质的应用APP&#xff0c;对于截屏和录屏场景&#xff0c;某些业务下是禁止不允许。 目前这种场景的需求也是非常有必要的&#xff0c;很多电诈都是通过远程录屏软件&#xff0c;获取到账户密码或者…

头颈肿瘤在PET/CT中的分割:HECKTOR挑战赛| 文献速递-深度学习肿瘤自动分割

Title 题目 Head and neck tumor segmentation in PET/CT: The HECKTOR challenge 头颈肿瘤在PET/CT中的分割&#xff1a;HECKTOR挑战赛 01 文献速递介绍 高通量医学影像分析&#xff0c;常被称为放射组学&#xff0c;已显示出其在揭示定量影像生物标志物与癌症预后之间关…

基于单片机的超声波倒车雷达设计

摘 要&#xff1a;文 章设计了一种基于单片机的超声波倒车雷达系统&#xff0c;以 AT89C51 型单片机作为控制核心&#xff0c;集距离测量、显示&#xff0c;方位显示和危险报警于一体&#xff0c;以提高驾驶者在倒车泊车时的安全性和舒适性。本设计采用 Keil 软件对系统程序…

Mysql全文搜索和LIKE搜索有什么区别

全文搜索和LIKE的区别 性能&#xff1a;在大数据集上&#xff0c;全文搜索通常比LIKE查询更快&#xff0c;因为它使用了专门的索引结构。 功能&#xff1a;全文搜索提供了更丰富的查询功能&#xff0c;如多个关键词的搜索、自然语言搜索、布尔搜索等。而LIKE通常只支持简单的…

已办理劳务资质,为何无法在全国建筑市场网查询到企业?

已办理劳务资质的企业无法在全国建筑市场网&#xff08;四库一平台&#xff09;查询到&#xff0c;可能的原因如下&#xff1a; 数据更新延迟&#xff1a; 全国建筑市场监管公共服务平台&#xff08;四库一平台&#xff09;的数据更新可能存在延迟。新获得的劳务资质信息在平台…

第一次参加学术会议?来看看这份NeurIPS 2024的参会攻略

会议之眼 快讯 嘿&#xff0c;亲爱的学者们&#xff01;有没有还没参加过学术会议的同学呢&#xff1f;别担心&#xff0c;今天小编就来给大家分享一份超实用的参会攻略&#xff0c;以人工智能领域备受瞩目的NeurIPS 2024为例&#xff0c;让你第一次参加学术会议就能像个老手一…

day4 数1 隐函数

基础知识 隐函数 &#xff1a;一个方程里边 使x有1个y与之对应 函数的有界性 f(X) 的值大于-M并小于M 单调性 可以用定义发判断单调性 定义法 奇函数 奇函数关于原点对称&#xff0c;偶关于x对称 定义域要关于原点对称 任何一个函数可以写成奇函数偶函数的形式 复合函数的…

实验室原始记录电子化管理的发展及应用

实验室原始记录电子化管理的发展及应用&#xff0c;主要体现在以下几个方面&#xff1a; 一、发展背景与意义 随着科技的进步和实验室管理的现代化&#xff0c;实验室原始记录电子化发展已成为必然趋势。传统的实验室原始记录方式主要依赖于纸质文档&#xff0c;这种方式存在诸…

gorm/gin框架实战

gorm/gin框架实战 项目简介 学习源视频&#xff1a;【最新Go Web开发教程】基于gin框架和gorm的web开发实战 (七米出品)_哔哩哔哩_bilibili 本博客为我的学习笔记。 项目目标&#xff1a;实现一个备忘录工具(当然不支持alert)&#xff0c;仅仅是可以记录待办事项。 实现了…

川北医学院与爱尔眼科医院集团签署战略合作协议共谋医学发展新篇章

为深入贯彻落实党的二十大精神&#xff0c;统筹校、企、医、政多方资源&#xff0c;服务“健康中国”战略&#xff0c;推动眼健康产业发展&#xff0c;打造国家及区域级眼科医学中心&#xff0c;2024年5月31日&#xff0c;川北医学院与爱尔眼科医院集团在成都举行战略合作协议签…

【EmguCV安装及使用】

“使用EmguCV自带的Image等类操作方便但运行效率要低于通过CvInvoke类直接调用OpenCV函数” 1、安装说明 1) 将安装目录下的bin文件夹路径添加到系统环境变量的path项中,如“C:\ EmguCV2.1.0.793\bin”。 2) 在visual studio 2005中通过C#新建一个工程,将EmguCV安装目录下…

数字化校园建设让学习更加广阔

校园构建数字化校园的亮点是什么&#xff1f;校园以智能服务、才智办理、数字讲堂为中心内容的智慧校园建造&#xff0c;不只使师生作业和日子更高效&#xff0c;并且使他们有更多的时刻投入到智能教育和智能学习中去&#xff0c;进步教育质量&#xff0c;使学生走出校门时紧跟…

二进制安装mysql8.1

MySQL的安装各个版本步骤几乎一致&#xff0c;本文以安装8.1为例 创建用户及安装需要的依赖包 创建用户及用户组 groupadd mysql useradd -g mysql -s /sbin/nologin mysql 安装依赖包 apt install libncurses5 libncursesw5 libaio1 numactl wget -y 获取二进制包 可以…

AI新纪元:生成式智能与工业革命的交响曲

在科技的浩瀚星空中,英伟达于最新的发布会中投下了一枚震撼弹,宣告了一个新时代的黎明——生成式AI的崛起,这一里程碑式的转折点,不仅重塑了我们对人工智能的认知边界,更预示着一场堪比特斯拉交流电动机问世的工业革命正在上演。 一、生成式AI:开创新纪元的钥匙 传统AI…

代码随想录第23天|回溯part3 组合与分割

39.组合总和 class Solution { public:vector<vector<int>> res;vector<int> path;void backTracking(vector<int>& candidates,int target,int sum,int n,int step){if(n > 150) return;if(sum > target) return;if(sum target){res.push_…

Scikit-Learn随机森林分类

Scikit-Learn随机森林分类 1、随机森林分类1.1、随机森林分类概述1.2、随机森林分类的优缺点2、Scikit-Learn随机森林分类2.1、Scikit-Learn随机森林分类API2.2、Scikit-Learn随机森林分类初体验(葡萄酒分类)2.3、Scikit-Learn随机森林分类实践(鸢尾花分类)2.4、参数调优与…

微信支付(可复用)

3.1微信支付 本项目选择小程序支付 参考&#xff1a;产品中心 - 微信支付商户平台微信支付商户平台提供各类支付产品满足商家通过微信支付收款的需求&#xff1b;平台提供智慧经营&#xff0c;现金红包&#xff0c;代金券等运营工具&#xff0c;助力商家更好的玩转营销&#x…

FCA-数知鸟 试题及答案

第1题【判断题】文档不可以设置层级关系 A. 正确B. 错误 正确答案&#xff1a;B 第2题【判断题】文档批量创建需求功能可以一次性创建不同类型的需求 A. 正确B. 错误 正确答案&#xff1a;B 第3题【判断题】甘特图中可以根据实际需要添加表格的显示字段&#xff0c;不可添加甘…

程序员应该有什么职业素养?

程序员的六大职业素养&#xff1a;构建成功职业生涯的基石 在不断变化的技术世界中&#xff0c;程序员不单要保持技术的锋利&#xff0c;也需要培养相应的职业素养&#xff0c;这些素养在很大程度上决定了一个程序员的职业生涯能否走得长远。以下是我认为最为重要的六大职业素…