首页 > 其他分享 >android架构组件Lifecycle

android架构组件Lifecycle

时间:2023-07-08 22:22:43浏览次数:38  
标签:void Event public MyLifeCycleObserver 组件 android onCreate Lifecycle

Lifecycle 组件指的是 android.arch.lifecycle 包下提供的各种类与接口,可以让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期(lifecycle-aware)的类。   在android开发的过程中,我们常常需要让一些操作能够感知Activity/Fragment的生命周期,从而实现在活动状态下允许操作,而在销毁状态下需要自动禁止操作,释放资源,防止内存泄露。例如大名鼎鼎的图片加载框架 Glide 在 Acticiy/Fragment 处于前台的时候加载图片,而在不可见的状态下停止图片的加载,又例如我们希望 RxJava 的 Disposable 能够在Activity/Fragment 销毁是自动 dispose。Lifecycle 的出现,让开发者们能够轻易地实现上述的功能。   使用 假设有一个Presenter,需要在Activity的各个生命周期,执行相应的方法,那么,只需要实现LifecycleObserver,这样,在Activity处于相应的生命周期的时候,相应的方法就会被调用:

public class MyPresent implements IPresent, LifecycleObserver {


    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    @Override
    public void onCreate() {
        LogUtil.i(TAG, "onCreate");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    @Override
    public void onStart() {
        LogUtil.i(TAG, "onStart");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    @Override
    public void onResume() {
        LogUtil.i(TAG, "onResume");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    @Override
    public void onPause() {
        LogUtil.i(TAG, "onPause");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    @Override
    public void onStop() {
        LogUtil.i(TAG, "onStop");
    }


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    @Override
    public void onDestory() {
        LogUtil.i(TAG, "onDestory");
    }
}
上述代码实现的是一个观察者,被观察者是Activity,Activity会将生命周期中的方法回调通知到观察者中对应的方法 然后在需要监听的 Activity 中注册:
public class MyActivity extends AppCompatActivity {

    protected MyPresent myPresent;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);

        getLifecycle().addObserver(new MyPresent()); //添加监听对象
    }

}

原理:

  • LifecycleOwner:生命周期的事件分发者,在 Activity/Fragment 他们的生命周期发生变化的时发出相应的 Event 给 LifecycleRegistry。
  • LifecycleObserver:生命周期的观察者,通过注解将处理函数与希望监听的Event绑定,当相应的Event发生时,LifecycleRegistry会通知相应的函数进行处理。
  • LifecycleRegistry:控制中心。它负责控制state的转换、接受分发event事件。

 

Lifecycle使用的三种基本使用方式:   第一种使用方式。使用@onLifecycleEvent注解。注解处理器会将该注解解析并动态生成GeneratedAdapter代码,这个GeneratedAdapter会把对应的 Lifecycle.Event 封装为方法调用。最终通过GenericLifecycleObserver的onStateChanged方法调用生成的GeneratedAdapter的callMechods方法进行事件分发
public class MyLifeCycleObserver implements LifeCycleObserver {
    @onLifecycleEvent(LifeCycle.Event.ON_CREATE)
    public onCreate(LifeCycleOwner owner) {
         //doSomething
    }
    @onLifecycleEvent(LifeCycle.Event.ON_DESTROY)     public onDestroy(LifeCycleOwner owner) {         //doSomething     } } public class MainActivity extends AppCompatActivity {     @override     public void onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)         getLifecycle().addObserver(new MyLifeCycleObserver());     } }
上述的例子中的 MyLifeCycleObserver 将会在编译时,生成GeneratedAdapter代码如下:
public class MyLifeCycleObserver_LifecycleAdapter implements GeneratedAdapter {


    final MyLifeCycleObserver mReceiver;


    MyLifeCycleObserver_LifecycleAdapter(MyLifeCycleObserver receiver) {
        //mReceiver就是我们开发者传入的MyLifeCycleObserver
        this.mReceiver = receiver;
    }


    //callMechod方法会被GenericLifecycleObserver的onStateChanged方法调用,用以分发生命周期
    @Override
    public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny, MethodCallsLogger logger) {
        boolean hasLogger = logger != null;
        if (onAny) {
            return;
        }


        //如果生命周期事件是ON_CREATE,那么调用MyLifeCycleObserver的onCreate方法
        if (event == Lifecycle.Event.ON_CREATE) {
            if (!hasLogger || logger.approveCall("onCreate", 2)) {
                mReceiver.onCreate(owner);
            }
            return;
        }


        //如果生命周期事件是ON_DESTROY,那么调用MyLifeCycleObserver的onDestroy方法
        if (event == Lifecycle.Event.ON_DESTROY) {
            if (!hasLogger || logger.approveCall("onDestroy", 2)) {
                mReceiver.onDestroy(owner);
            }
            return;
        }
    }
}
第二种使用方式。直接继承 GenericLifecycleObserver,并实现onStateChange 方法:
public class MyLifeCycleObserver extends GenericLifeCycleObserver {


    @override
    void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        if(event == LifeCycleEvent.Event.ON_CREATE) {
            //dosomething
        } else if(event == LifeCycleEvent.Event.ON_DESTROY) {
            //doSomething
        }    
    }
}


public class MainActivity extends AppCompatActivity {


    @override
    public void onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getLifecycle().addObserver(new MyLifeCycleObserver());
    }
}
 第三种使用方式。继承 DefaultLifecycleObserver 接口(DefaultLifecycleObserver 又继承自 FullLifecycleObserver接口),并实现 FullLifecycleObserver 接口的 onCreate、onStart、onResume、onPause、onStop、onDestroy 等对应各自生命周期的方法
class MyLifycycleObserver implements DefaultLifecycleObserver {


    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        //doSomething
    }


    ......


    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        //doSomething   
    }
}


public class MainActivity extends AppCompatActivity {


    @override
    public void onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getLifecycle().addObserver(new MyLifeCycleObserver());
    }
}

 

 

标签:void,Event,public,MyLifeCycleObserver,组件,android,onCreate,Lifecycle
From: https://www.cnblogs.com/ttylinux/p/17538002.html

相关文章

  • Android架构组件LiveData
    LiveDataLiveData是基于观察者模式创建的,其中,LiveData是被观察者,观察者通过注册方法,监听被观察者的数据变化。LiveData在数据发生变化的时候,会通知观察者。LiveData是一个容器,存放数据的容器,它的数据变化可以被监听,也就是LiveData是一个被观察者,如下,创建了一个存放String的数据......
  • Unity UGUI的Toggle(复选框)组件的介绍及使用
    UnityUGUI的Toggle(复选框)组件的介绍及使用1.什么是Toggle组件?Toggle(复选框)是UnityUGUI中的一个常用组件,用于实现复选框的功能。它可以被选中或取消选中,并且可以代码通过其制控状态。2.Toggle组件的工作原理组Toggle件由两个部分组成:背景记标和。景背用于显示复选框的外观表......
  • Unity UGUI的Image(图片)组件的介绍及使用
    UGUI的Image(图片)组件的介绍及使用1.什么是UGUI的Image(图片)组件?UGUI的Image(图片)组件是Unity引擎中的一种UI组件,用于显示2D图像。它提供了一种简单而灵活的方式来在游戏中加载和显示图片。2.为什么要使用UGUI的Image(图片)组件?使用UGUI的Image组件可以方便地在游戏中展示各种图片......
  • Android开发腾讯云智面经分享
    分享一位读者面试腾讯云智(腾讯集团旗下的全资子公司)投稿的面经,主要记录了自己在面试过程中遇到的问题。下面是正文。本人在湖北的一所民办二本,学校非常一般。由于寒气逼人,快到七月才拿到offer,感谢腾讯云智!!!腾讯云智(武汉)一面(40min)1、GC原理,有哪几种GC方式。2、HashMap原理。3、H......
  • Vue组件化编程
    一、非单文件组件1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>非单文件组件</title>6<scriptsrc="js/vue.js"></script>7</hea......
  • Unity UGUI的Text(文本)组件的介绍及使用
    UGUI的Text(文本)组件的介绍及使用什么是UGUI的Text(文本)组件?UGUI(UnityGraphicUserInterface)是Unity引擎的一套用户界面系统,而Text(文本)组件是UGUI中用于在游戏界面中显示文本的组件。该组件可以用于显示游戏中的文字、数字、标签等信息。为什么要使用UGUI的Text(文本)组件?使用UG......
  • 实现组件赋值后重新渲染
    通过vuekey实现,原理官方文档。所以当key值变更时,会自动的重新渲染。<template><third-comp:key="menuKey"/></template><script>exportdefault{data(){return{menuKey:1}},watch:{menuTree(){++this.menuKey}}}</sc......
  • Android 14 功能和变更列表
    Android14功能和变更列表https://developer.android.google.cn/about/versions/14/summary?hl=zh-cnAndroid13功能和变更列表https://developer.android.google.cn/about/versions/13/summary?hl=zh-cn Android14功能和变更列表下表列出了所有记录的可能会影响应用开......
  • vue - v-model在组件上的应用(包含子传父)
    一、v-model的参数默认情况下,v-model在组件上都是使用modelValue作为prop,并以update:modelValue作为对应的事件。我们可以通过给v-model指定一个参数来更改这些名字:<MyComponentv-model:title="bookTitle"/>在这个例子中,子组件应声明一个titleprop,并通过触发upd......
  • Android实时获取摄像头画面传输至PC端
    前言最近在做一个PC端小应用,需要获取摄像头画面,但是电脑摄像头像素太低,而且位置调整不方便,又不想为此单独买个摄像头。于是想起了之前淘汰掉的手机,成像质量还是杠杠的,能不能把手机摄像头连接到电脑上使用呢?经过搜索,在网上找到了几款这类应用,但是都是闭源的。我一向偏好使用开源软......