Lifecycle 简单使用

一、说明

当系统组件Activity、Fragment、Service和Application的生命周期发生变化时,我们的自定义Lifecycle能得到通知,不必在系统组件的回调方法中进行逻辑处理,自己就能处理自己的逻辑,降低耦合性。(说明:所有生命周期监听方法在组件生命周期方法执行后回调。同一个类实现中注解与非注解同时存在只会回调非注解)

二、使用

  1. 添加依赖
    在官网找合适版本的依赖。

  2. 自定义 Lifecycle。

    • 非注解注解定义 Lifecycle-----实现 DefaultLifecycleObser 接口
    public class MyDefaultLifecycleObserver implements DefaultLifecycleObserver {private static final String TAG = "MyDefaultObserver:   ";@Overridepublic void onCreate(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onCreate(owner);Log.i(MVVMTestActivity.TAG, TAG + "I am onCreate Method Observer by method.");}@Overridepublic void onStart(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onStart(owner);Log.i(MVVMTestActivity.TAG,TAG + "I am onStart Method Observer by method.");}@Overridepublic void onResume(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onResume(owner);Log.i(MVVMTestActivity.TAG,TAG + "I am onResume Method Observer by method.");}@Overridepublic void onPause(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onPause(owner);Log.i(MVVMTestActivity.TAG,TAG + "I am onPause Method Observer by method.");}@Overridepublic void onStop(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onStop(owner);Log.i(MVVMTestActivity.TAG,TAG + "I am onStop Method Observer by method.");}@Overridepublic void onDestroy(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onDestroy(owner);Log.i(MVVMTestActivity.TAG,TAG + "I am onDestroy Method Observer by method.");}}
    
    • 注解式定义 Lifecycle,实现 LifecycleObserver 接口
    public class MyLifecycleObserver implements LifecycleObserver {private static final String TAG = "My@InterfaceObserver: ";@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)public void onCreateDo(){Log.i(MVVMTestActivity.TAG,TAG + "I am onCreate Method Observer by @interface.");}@OnLifecycleEvent(Lifecycle.Event.ON_START)public void onStartDo(){Log.i(MVVMTestActivity.TAG,TAG + "I am onStart Method Observer by @interface.");}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)public void onResumeDo(){Log.i(MVVMTestActivity.TAG,TAG + "I am onResume Method Observer by @interface.");}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)public void onPauseDo(){Log.i(MVVMTestActivity.TAG,TAG + "I am onPause Method Observer by @interface.");}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)public void onStopDo(){Log.i(MVVMTestActivity.TAG,TAG + "I am onStop Method Observer by @interface.");}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)public void onDestroy(){Log.i(MVVMTestActivity.TAG,TAG + "I am onDestroy Method Observer by @interface.");}
    }
    
  3. 监听生命周期

    • 监听 Activity
     @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在 Activity 中添加 LifecyclegetLifecycle().addObserver(new MyDefaultLifecycleObserver());
    }
    
    • 监听 Fragment
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//Fragment 中添加 LifecyclegetLifecycle().addObserver(new MyLifecycleObserver());
    }
    
    • 监听 Service

      1. 首先自定义的 Service 需要实现 LifecycleService,或者自己分别实现 Service 和 LifecyclerOwner。
      public class MyLifecycleService extends LifecycleService {@Overridepublic void onCreate() {super.onCreate();}@Nullable@Overridepublic IBinder onBind(@NonNull Intent intent) {return super.onBind(intent);}
      }
      
      1. 在自定义的 Service 中添加 Lifecycle
      @Override
      public void onCreate() {super.onCreate();//在 Service 中添加 LifecyclergetLifecycle().addObserver(new MyLifecycleObserver());
      }
      
    • 监听 Application
      在自定义 Application 中添加 Lifecycle
    public class MyApplication extends Application {@Overridepublic void onCreate() {//对 Application 添加 LifecycleProcessLifecycleOwner.get().getLifecycle().addObserver(new MyDefaultLifecycleObserver());super.onCreate();}
    }
    

三、使用说明

  1. 实现非注解式 DefaultLifecycleObserver 接口中,同名方法为监听生命周期;实现注解式 LifecycleObserver 接口中,@OnlifecycleEvent(Lifecycle.Event.ON_XXX):表示生命周期onXXX回调方法调用后会回调被该注解标识的方法。
  2. 同时实现 DefaultLifecycleObserver 和 LifecycleObserver 的话,只会调用 DefaultLifecycleObserver 非注解实现。
  3. 监听 Application 时,Lifecycle.Event.ON_CREATE只会回调一次,Lifecycle.Event.ON_DESTROY永远不会回调。

四、原理

addObserver()方法执行流程:

  1. 初始化一个State状态值;
  2. 将宿主状态的初始值和传递进来的LifecycleObserver封装成一个ObserverWithState对象;
  3. 将ObserverWithState对象存入一个Map中;
  4. calculateTargetState(observer)计算得出宿主的状态;
  5. 将ObserverWithState的状态前进到和宿主相同的状态;5.1)分发状态变化,内部会调用onStateChanged()方法;

说明:

  1. 宿主生命周期与宿主状态不等同,宿主状态:INITIALIZED->DESTROYED->CREATED->STARTED->RESUMED;宿主分发生命周期状态调用方法handleLifecycleEvent(),该方法作用为对状态同步并分发对应事件。
  2. addObserver()会循环逐步同步Observer和宿主状态mStatus,当宿主自身状态发生改变时,主动调用handleLifecycleEvent()方法进行状态同步,同步过程中会调用LifecycleObserve的onStatusChange()方法。

lifecycle基本使用相关推荐

  1. Spring Boot项目错误:Error parsing lifecycle processing instructions

    pom.xml文件错误:Error parsing lifecycle processing instructions 解决方法:清空.m2/repository下的所有依赖文件,重新下载即可解决该问 ...

  2. React文档 state and lifecycle

    状态和生命周期 这篇介绍 React 组件中状态和声明周期的概念.详情可以查看API参考 . 思考前一部分中时钟的例子.渲染元素中,我们仅学习了一种更新 UI 的方式.调用 ReactDOM.rend ...

  3. 好记性不如烂笔杆-android学习笔记二 Acitvity lifecycle 生命周期

    7,//Acitvity lifecycle 生命周期 /** *1,一个Activity就是一个类,并且这个类要继承Activity *2,复写onCreate方法 *3,每个Activity需要在 ...

  4. Spring中SmartLifecycle和Lifecycle的作用和区别

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...

  5. Maven:No goals have been specified for this build. You must specify a valid lifecycle phase

    1. 执行打包命令报错: No goals have been specified for this build. You must specify a valid lifecycle phase o ...

  6. Lifecycle Activity和Fragment生命周期感知组件 LifecycleObserver MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. Unknown lifecycle phase mvn

    Unknown lifecycle phase "mvn" maven执行命令错误  : 执行输入命令即可,不需要添加 mvn 此处不需要写mvn,而是执行写compile就行,否 ...

  8. Android JetPack Lifecycle源码解析

    是什么? JetPack Lifecycle是一个页面(Activity/Fragment)生命周期的组件,当你想监听生命周期,那么就可以使用这个组件. 怎么用? 第一种: getLifecycle( ...

  9. Android Jetpack 组件之 Lifecycle源码

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

  10. Android Jetpack 组件之 Lifecycle使用

    1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...

最新文章

  1. 人工智能、大数据的广泛应用,算法推荐如何守好边界
  2. ASP.NET 使用 System.Web.Script.Serialization 解析 JSON (转)
  3. c语言常见50题 及答案(递归 循环 以及常见题目)
  4. 深入Android 【六】 —— 界面构造
  5. 1001. A+B Format (20)---------------PAT开始
  6. UVA 10891——Game of Sum
  7. Ubuntu修复Fix Busybox Initramfs错误
  8. Makefile中自定义函数的调用
  9. Java中9大内置基本数据类型Class实例和数组的Class实例
  10. BZOJ 3831 POI2014 Litter Bird
  11. 获得当月时间chuo_擅用GTD时间管理法,远离焦虑情绪,让你的工作、学习井然有序...
  12. java 遍历文件夹 性能_Java函数式编程(十一):遍历目录
  13. 【C语言】07-基本语句和运算
  14. pgadmin3连接mysql_postgresql – PgAdmin III – 密码为空时如何连接数据库?
  15. Arm Compiler 5 在 Keil MDK 5.37中不可用
  16. Spring5入门学习一
  17. 长方形内正方形Square
  18. 【C语言】输出杨辉三角形 - 杨辉直角三角形(杨辉三角最佳算法) 输出杨辉三角前十行
  19. linux 搭建技术博客,Linux NTP服务器搭建精讲
  20. 计算机电源可调电阻,电脑ATX电源改0V-30V可调电源,电流7A

热门文章

  1. 图像质量评价指标:PSNR
  2. 破解root密码的两种方法
  3. Mupdf的so编译
  4. “这里不会发生”:大多数组织都否认网络威胁
  5. 2019-9-2-一粒在时空轮回的粒子会发生什么
  6. 比较两个字符串的大小(C)
  7. Nginx实现 内网访问外网https页面资源的解决方案
  8. springBoot配置文件设置mongodb连接密码加密
  9. 花 150 亿美元,Google 成为苹果设备的默认搜索引擎?
  10. mysql的高级查询实例_mysql高级查询实例及cmd命令.doc