lifecycle基本使用
Lifecycle 简单使用
一、说明
当系统组件Activity、Fragment、Service和Application的生命周期发生变化时,我们的自定义Lifecycle能得到通知,不必在系统组件的回调方法中进行逻辑处理,自己就能处理自己的逻辑,降低耦合性。(说明:所有生命周期监听方法在组件生命周期方法执行后回调。同一个类实现中注解与非注解同时存在只会回调非注解)
二、使用
添加依赖
在官网找合适版本的依赖。自定义 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.");} }
监听生命周期
- 监听 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
- 首先自定义的 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);} }
- 在自定义的 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();} }
三、使用说明
- 实现非注解式 DefaultLifecycleObserver 接口中,同名方法为监听生命周期;实现注解式 LifecycleObserver 接口中,@OnlifecycleEvent(Lifecycle.Event.ON_XXX):表示生命周期onXXX回调方法调用后会回调被该注解标识的方法。
- 同时实现 DefaultLifecycleObserver 和 LifecycleObserver 的话,只会调用 DefaultLifecycleObserver 非注解实现。
- 监听 Application 时,Lifecycle.Event.ON_CREATE只会回调一次,Lifecycle.Event.ON_DESTROY永远不会回调。
四、原理
addObserver()方法执行流程:
- 初始化一个State状态值;
- 将宿主状态的初始值和传递进来的LifecycleObserver封装成一个ObserverWithState对象;
- 将ObserverWithState对象存入一个Map中;
- calculateTargetState(observer)计算得出宿主的状态;
- 将ObserverWithState的状态前进到和宿主相同的状态;5.1)分发状态变化,内部会调用onStateChanged()方法;
说明:
- 宿主生命周期与宿主状态不等同,宿主状态:INITIALIZED->DESTROYED->CREATED->STARTED->RESUMED;宿主分发生命周期状态调用方法handleLifecycleEvent(),该方法作用为对状态同步并分发对应事件。
- addObserver()会循环逐步同步Observer和宿主状态mStatus,当宿主自身状态发生改变时,主动调用handleLifecycleEvent()方法进行状态同步,同步过程中会调用LifecycleObserve的onStatusChange()方法。
lifecycle基本使用相关推荐
- Spring Boot项目错误:Error parsing lifecycle processing instructions
pom.xml文件错误:Error parsing lifecycle processing instructions 解决方法:清空.m2/repository下的所有依赖文件,重新下载即可解决该问 ...
- React文档 state and lifecycle
状态和生命周期 这篇介绍 React 组件中状态和声明周期的概念.详情可以查看API参考 . 思考前一部分中时钟的例子.渲染元素中,我们仅学习了一种更新 UI 的方式.调用 ReactDOM.rend ...
- 好记性不如烂笔杆-android学习笔记二 Acitvity lifecycle 生命周期
7,//Acitvity lifecycle 生命周期 /** *1,一个Activity就是一个类,并且这个类要继承Activity *2,复写onCreate方法 *3,每个Activity需要在 ...
- Spring中SmartLifecycle和Lifecycle的作用和区别
欢迎关注方志朋的博客,回复"666"获面试宝典 本文基于SpringBoot 2.5.0-M2讲解Spring中Lifecycle和SmartLifecycle的作用和区别,以及如 ...
- 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 ...
- Lifecycle Activity和Fragment生命周期感知组件 LifecycleObserver MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Unknown lifecycle phase mvn
Unknown lifecycle phase "mvn" maven执行命令错误 : 执行输入命令即可,不需要添加 mvn 此处不需要写mvn,而是执行写compile就行,否 ...
- Android JetPack Lifecycle源码解析
是什么? JetPack Lifecycle是一个页面(Activity/Fragment)生命周期的组件,当你想监听生命周期,那么就可以使用这个组件. 怎么用? 第一种: getLifecycle( ...
- Android Jetpack 组件之 Lifecycle源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack 组件之 Lifecycle使用
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
最新文章
- 人工智能、大数据的广泛应用,算法推荐如何守好边界
- ASP.NET 使用 System.Web.Script.Serialization 解析 JSON (转)
- c语言常见50题 及答案(递归 循环 以及常见题目)
- 深入Android 【六】 —— 界面构造
- 1001. A+B Format (20)---------------PAT开始
- UVA 10891——Game of Sum
- Ubuntu修复Fix Busybox Initramfs错误
- Makefile中自定义函数的调用
- Java中9大内置基本数据类型Class实例和数组的Class实例
- BZOJ 3831 POI2014 Litter Bird
- 获得当月时间chuo_擅用GTD时间管理法,远离焦虑情绪,让你的工作、学习井然有序...
- java 遍历文件夹 性能_Java函数式编程(十一):遍历目录
- 【C语言】07-基本语句和运算
- pgadmin3连接mysql_postgresql – PgAdmin III – 密码为空时如何连接数据库?
- Arm Compiler 5 在 Keil MDK 5.37中不可用
- Spring5入门学习一
- 长方形内正方形Square
- 【C语言】输出杨辉三角形 - 杨辉直角三角形(杨辉三角最佳算法) 输出杨辉三角前十行
- linux 搭建技术博客,Linux NTP服务器搭建精讲
- 计算机电源可调电阻,电脑ATX电源改0V-30V可调电源,电流7A