美文网首页Android...
Android——JetPack{LifeCycle}

Android——JetPack{LifeCycle}

作者: So_ProbuING | 来源:发表于2021-09-09 12:32 被阅读0次

LifeCycle

LifeCycle的诞生

在Android应用程序开发中,解耦很大程度上表现为系统组件的生命周期与普通组件之间的解耦。普通组件在使用过程中通常需要依赖于系统组件的生命周期。
我们经常需要在页面的onCreate()方法中对组件进行初始化,在onPause()方法中停止组件,而在页面的onDestroy()方法中对组件进行资源回收。这样的方式会让页面与组件之间的耦合度变高。但是这种工作又不得不做,如果不这样做可能会导致内存泄漏。
我们希望我们对自定义组件的管理,不依赖于页面生命周期的回调方法。希望在页面生命周期发生变化时,也能够及时收到通知,这在组件化和架构设计中显得很重要
在这种需求中,Google提供了LifeCycle作为解决方案。LifeCycle可以帮助开发者创建可感知生命周期的组件,这样组件能够在内部管理自己的生命周期,从而降低模块间的耦合度,并降低内存泄漏的发生。

LifeCycle的原理

LifeCycle为我们提供了两个类:LifeCycleOwner(被观察者)和LifecycleObserver(观察者),通过观察者模式,实现对页面生命周期的监听
在新版本的SDK中,Activity和Fragment已经默认实现了LifeCycleOwner接口。

使用LifeCycle解耦页面与组件

  • 案例说明
    假设又这样一个需求:用户在打开某个页面时,获取用户当前的地理位置,我们通常会这样做
 package com.probuing.jetpacklsn;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "main";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initLocationManage();
    }

    @Override
    protected void onResume() {
        super.onResume();
        startGetLocation();
    }

    @Override
    protected void onPause() {
        super.onPause();
        pauseGetLocation();
    }
    private void pauseGetLocation() {
        Log.d(TAG, "pauseGetLocation: 暂停获取用户位置");
    }
    private void startGetLocation() {
        Log.d(TAG, "startGetLocation: 开始获取用户位置");
    }
    private void initLocationManage() {
        Log.d(TAG, "initLocationManage: 初始化位置管理器");
    }
}

解决方案

我们利用LifeCycle改写,我们将Activity独立出去

  1. 编写一个名为MyLocationListener的类,该组件实现LifecycleObserver接口。与获取地理位置相关的代码在该类中完成
package com.probuing.jetpacklsn;

import android.app.Activity;
import android.util.Log;

import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;

public class MyLocationListenerManager implements LifecycleObserver {
    private static final String TAG = MainActivity.TAG;
    private final OnLocationChangeListener listener;

    public MyLocationListenerManager(Activity context, OnLocationChangeListener onLocationChangeListener) {
        this.listener = onLocationChangeListener;
        initLocationManager();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void initLocationManager() {
        Log.d(TAG, "initLocationManager");
        listener.onInit();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private void startGetLocation() {
        Log.d(TAG, "startGetLocation");
        listener.onGetStart();
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private void pauseGetLocation() {
        Log.d(TAG, "pauseGetLocation");
        listener.onGetPause();
    }
}
  1. 定义接口
public interface OnLocationChangeListener {
    void onInit();

    void onGetStart();

    void onGetPause();
}

  1. 在Activity中通过getLifecycle().addObserver()将观察者与被观察者绑定
public class MainActivity extends AppCompatActivity implements OnLocationChangeListener {

    public static final String TAG = "main";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MyLocationListenerManager locationListenerManager = new MyLocationListenerManager(this, this);
        //将观察者与被观察者锁定
        getLifecycle().addObserver(locationListenerManager);
    }


    @Override
    public void onInit() {
        Log.d(TAG, "onInit: onManageInit");
    }

    @Override
    public void onGetStart() {
        Log.d(TAG, "onGetStart: onManageStart");
    }

    @Override
    public void onGetPause() {
        Log.d(TAG, "onGetPause: onManagePause");
    }
}

使用LifecycleService解耦Service与组件

LifeCycleService基本介绍

Android提供了一个名为LifecycleService的类,该类继承自Service,并实现了LifecycleOwner接口。与Activity/Fragment类似,Service也提供了一个名为getLifecycle()的方法供我们使用。

LifecycleService的具体使用

  1. build.gradle添加相关依赖
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

  1. 创建一个名为MyService的类,并让它继承自LifecycleService。
public class MyService extends LifecycleService {
    private MyServiceObserver observer;

    public MyService() {
        observer = new MyServiceObserver();
        getLifecycle().addObserver(observer);
    }
}

  1. 创建MyServiceObserver类,该类实现LifecycleObserver接口,然后使用注解@OnLifecycleEvent标签来标识希望能够在Service生命周期发生变化时同步调用的方法
public class MyServiceObserver implements LifecycleObserver {
    private  final String TAG = getClass().getName();

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void startGetLocation(){
        Log.d(TAG, "startGetLocation: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    private void stopGetLocation(){
        Log.d(TAG, "stopGetLocation: ");
    }
}

使用ProcessLifecycleOwner监听应用程序的生命周期

ProcessLifecycleOwner的存在意义

有时候我们会希望:我们的想知道应用程序当前处于前台还是后台,或者应用程序从后台回到前台时。我们能够得到通知。ProcessLifecycleOwner便可以让我们知道整个应用的生命周期情况

ProcessLifecycleOwner的具体使用方法

  1. build.gradle中添加相关依赖
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
  1. ProcessLifecycleOwner的使用方式与Activity、Fragment和Service是类似的,本质也是观察者模式
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
    }
}
  1. 定义观察者 ApplicationObserver类,该类实现LifecycleObserver接口
public class ApplicationObserver implements LifecycleObserver {
    private static final String TAG = "Application";

    @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: ");
    }
}

相关文章

网友评论

    本文标题:Android——JetPack{LifeCycle}

    本文链接:https://www.haomeiwen.com/subject/kwauwltx.html