Jetpack架构组件_LifeCycle组件

2024-06-04 06:12

本文主要是介绍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打印日志。

               

这篇关于Jetpack架构组件_LifeCycle组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029286

相关文章

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Vue3中的动态组件详解

《Vue3中的动态组件详解》本文介绍了Vue3中的动态组件,通过`component:is=动态组件名或组件对象/component`来实现根据条件动态渲染不同的组件,此外,还提到了使用`markRa... 目录vue3动态组件动态组件的基本使用第一种写法第二种写法性能优化解决方法总结Vue3动态组件动态

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb