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

相关文章

Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析

《Spring组件实例化扩展点之InstantiationAwareBeanPostProcessor使用场景解析》InstantiationAwareBeanPostProcessor是Spring... 目录一、什么是InstantiationAwareBeanPostProcessor?二、核心方法解

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

PyQt6中QMainWindow组件的使用详解

《PyQt6中QMainWindow组件的使用详解》QMainWindow是PyQt6中用于构建桌面应用程序的基础组件,本文主要介绍了PyQt6中QMainWindow组件的使用,具有一定的参考价值,... 目录1. QMainWindow 组php件概述2. 使用 QMainWindow3. QMainW

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

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