Lifecycle应用
上一篇 文章分析了lifecycle的源码,源码真的很枯燥,不过有了上一篇的基础,我们再来分析lifecycle的应用就简单多了。lifecycle应用中最重要的两个类是:LifecycleOwner 和 LifecycleObserver ,前者是提供lifecycle生命周期的,后者是观察者,我们马上会分析源码,先看应用:
自定义一个handler,解决内存泄漏问题:
public class LifecycleHandler extends Handler implements LifecycleEventObserver {private LifecycleOwner mLifecycleOwner;public LifecycleHandler(LifecycleOwner lifecycleOwner) {this.mLifecycleOwner = lifecycleOwner;lifecycleOwner.getLifecycle().addObserver(this);}@Overridepublic void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {switch (event) {case ON_DESTROY:removeCallbacksAndMessages(null);mLifecycleOwner.getLifecycle().removeObserver(this);break;}}
}
使用如下:
private Handler mHanlder=new LifecycleHandler(this){//this是activity或者fragment@Overridepublic void handleMessage(@NonNull Message msg) {switch (msg.what){//......}}};
就这样,我们就可以放心使用handler了,不用担心内存泄漏了。
源码分析:
1.LifecycleOwner 源码解析:
public interface LifecycleOwner {@NonNullLifecycle getLifecycle();
}
源码就这么简单,一个接口,获取lifecycle。那么他的实现类是谁呢?ComponentActivity和fragment :
*/
public class ComponentActivity extends androidx.core.app.ComponentActivity implementsLifecycleOwner {private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);@NonNull@Overridepublic Lifecycle getLifecycle() {return mLifecycleRegistry;}
}
简化后的代码就这么多,是不是很熟悉,LifecycleRegistry 就是上一篇我们分析的源码,我们添加的所有观察者都会放到LifecycleRegistry 的链表中,当LifecycleOwner(也就是activity)的生命周期发生改变时,会调用所有观察者的onStateChanged 方法。
2.LifecycleObserver 观察者源码分析:
public interface LifecycleObserver {}
空接口,什么也没有做,那么来看看他的子类:LifecycleEventObserver
public interface LifecycleEventObserver extends LifecycleObserver {void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}
定义了一个抽象方法,状态改变的回调方法,上面分析过了。
那么lifecycle的所有源码我们都已经分析完了,其实原理很简单,就是通过一个抽象层lifecycle,将具有生命周期的对象,把生命周期暴露出来,其他所有想和他的生命周期关联的对象,都可以通过lifecycle解耦来实现,最大的用处应该就是封装第三方库和解决内存泄漏问题。
再来写两个应用案例:
1.service中使用
public void startService(){LifecycleService service = new LifecycleService();service.getLifecycle().addObserver(new LifecycleServiceObservier(service));startService(new Intent(this, LifecycleService.class));}public class LifecycleServiceObservier implements LifecycleEventObserver {private LifecycleOwner mLifecycleOwner;public LifecycleServiceObservier(LifecycleOwner lifecycleOwner) {this.mLifecycleOwner = lifecycleOwner;}@Overridepublic void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {switch (event) {case ON_CREATE://服务创建break;case ON_START://start或bind方法break;case ON_DESTROY:mLifecycleOwner.getLifecycle().removeObserver(this);break;}}
}
2.监听app进入前后台:
application的oncreate中增加:
ProcessLifecycleOwner.get().getLifecycle().addObserver(new BackgroundFroutChangeObsever());
public class BackgroundFroutChangeObsever implements LifecycleEventObserver {@Overridepublic void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {switch (event){case ON_RESUME:Log.e("TAG", "onStateChanged: 应用处于前台");break;case ON_STOP:Log.e("TAG", "onStateChanged: 应用处于后台");break;}}
}
就可以方便监听应用是否处于前后台了,不过实际中发现在某些手机上不是很准。
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 ...
最新文章
- python3 多进程 同步
- 最小硬盘实现单原子信息存储 超现有硬盘500倍
- 【python】【scrapy】使用方法概要(三)
- 结合控制台程序和K8S的CronJob完成定时任务
- 面试题55 - I. 二叉树的深度
- 三天学会HTML5 ——多媒体元素的使用
- 2017前端技术大盘点 1
- 指针 是否相同_【变电小课堂】MF47指针式万用表操作指南
- AndroidTV开发(十一)Android Tv Launcher自定义RecyclerView
- topjui/easyui 表格分页简单实例
- c语言判断闰年并输出该月天数,C语言宏定义实现闰年判断并输出指定月的天数...
- 带本科生做毕设是什么样的体验,看看学生是怎么评价我的
- 注释大全,神兽护体,佛祖保佑,永无bug
- sh报错 [: unexpected operat
- android 仿微视,腾讯微视和抖音一样?模仿还是照搬?
- Leanback(1)-播放控制栏下添加新的行
- 笔记本外接显示器显示器水波纹问题+解决方案
- COM操作Excel
- 【PyTorch深度学习项目实战100例】—— 基于逻辑回归方法完成垃圾邮件过滤任务 | 第22例
- 电力系统为什么是三相的
热门文章
- Linux桌面图标锁定不让移动,【电脑小知识】桌面布局被锁定,图标不能随意移动了怎么办?...
- react的同步和异步
- 30个Python练手项目
- 避免HashMap扩容的正确姿势
- ajax 多人聊天吧,基于Nodejs利用socket.io实现多人聊天室
- 用python输出下列图案_使用Python打印图案“有趣”
- Unity递归遍历给定物体的所有子物体
- python 遍历列表后保存_Python遍历列表以在asyncio中获取api调用并保存结果
- noVNC 安装、配置与使用
- Android常见的几个问题及解决方法