首页 > 其他分享 >Jetpack架构组件_LifeCycle组件

Jetpack架构组件_LifeCycle组件

时间:2024-06-03 16:29:14浏览次数:23  
标签:Log androidx Jetpack void LifeCycle TAG 组件 import public

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;
    @Override
    protected 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);
    }

    @Override
    public void onCreate() {
        Log.i(TAG, "onCreate");
        super.onCreate();
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        Log.i(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public 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;

    @Override
    protected 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() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, MyService.class);
                startService(i);
            }
        });

        /**
         * 停止服务
         */
        activityMainBinding.btStopService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, MyService.class);
                stopService(i);
            }
        });

    }


    @Override
    protected void onStop() {
        Log.i(TAG, "onStop");
        super.onStop();
    }

    @Override
    protected 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;
    @Override
    public 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">

    <application
        android: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">
        <activity
            android: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打印日志。

               

标签:Log,androidx,Jetpack,void,LifeCycle,TAG,组件,import,public
From: https://blog.csdn.net/huaqianzkh/article/details/139413777

相关文章

  • 微软官方开源免费的Blazor UI组件库 - Fluent UI Blazor
    前言今天大姚给大家分享一个由微软官方开源(MITLicense)、免费的BlazorUI组件库:FluentUIBlazor。全面的ASP.NETCoreBlazor简介和快速入门FluentUIBlazor介绍FluentUIBlazor是一个基于Blazor的组件库,提供了一系列的UI组件以及FluentUI的设计系统。该库可以帮助开发......
  • vue3异步组件
    vue2//定义一个异步组件constAsyncComponent=()=>({//需要加载的组件(应该是一个Promise)component:import('./MyComponent.vue'),//加载中应当渲染的组件loading:LoadingComponent,//出错时渲染的组件error:ErrorComponent,//渲染loadin......
  • 使用form-create监听组件的事件
    FormCreate是一个可以通过JSON生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持5个UI框架,并且支持生成任何Vue组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定FormCreate官网:https://www.form-create.com帮助文档:https://form-create.c......
  • 使用form-create生成表单组件
    FormCreate是一个可以通过JSON生成具有动态渲染、数据收集、验证和提交功能的表单生成组件。支持5个UI框架,并且支持生成任何Vue组件。内置20种常用表单组件和自定义组件,再复杂的表单都可以轻松搞定FormCreate官网:https://www.form-create.com帮助文档:https://form-create.c......
  • Vue.js 动态组件与异步组件
    title:Vue.js动态组件与异步组件date:2024/6/2下午9:08:50updated:2024/6/2下午9:08:50categories:前端开发tags:Vue概览动态组件异步加载性能提升路由管理状态控制工具生态第1章Vue.js简介1.1Vue.js概述Vue.js是一个渐进式的JavaScript框架,用于构......
  • rt-thread 系统pm组件在4.1.1版本的无法正常唤醒的问题解决方法
    在老的rt-thread版本系统pm组件调试ok,后来使用4.1.1版本时发现进入低功耗后无法正常唤醒,问题解决路径如下硬件信息:cpu STM32L431CCT6新建系统打开pm组件后也没有drv_pm.c和drv_lptim.c自动添加,需要到系统目下找到并复制到driver目录下C:\RT-ThreadStudio\repo\Extract\R......
  • [干货]在纯血鸿蒙星河版next中组件封装方法--看我就够了
    首先组件封装一般是为了解决两个问题,复用和一定程度上提高维护性,组件的本质就是一个接受参数返回UI的函数容器,所以封装的重点和难点就是抽象合适的参数类型返回合适的UI,接下来我来给家人们说说封装组件的一般方法封装组件的一般方法呢有两种,思想家人们掌握之后往上套就行了,我......
  • 鸿蒙HarmonyOS实战-Web组件(请求响应和页面调试)
    ......
  • 【实战教程】构建可复用的 Spring Boot starter 微服务组件
    案例Demo:https://gitee.com/regexpei/coding-trainee/tree/demo/20240526_starter介绍在SpringBoot中,starter启动依赖就像一个“开箱即用”的工具箱,它包含了第三方组件的配置和依赖,让我们无需手动配置和添加这些组件。通过starter,我们可以轻松地将通用的代码和配......
  • 二维码生成器 ZXing.Net 组件应用
    c#二维码生成器(ZXing.Net)实现安装组件CodeusingSunny.UI;usingSystem;usingSystem.Collections.Generic;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingSystem.Windows.Forms;usingZXing;usingZXing.Common;usingZXing.QrCode.Internal;namespace......