上一篇 文章分析了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应用相关推荐

  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. python3 多进程 同步
  2. 最小硬盘实现单原子信息存储 超现有硬盘500倍
  3. 【python】【scrapy】使用方法概要(三)
  4. 结合控制台程序和K8S的CronJob完成定时任务
  5. 面试题55 - I. 二叉树的深度
  6. 三天学会HTML5 ——多媒体元素的使用
  7. 2017前端技术大盘点 1
  8. 指针 是否相同_【变电小课堂】MF47指针式万用表操作指南
  9. AndroidTV开发(十一)Android Tv Launcher自定义RecyclerView
  10. topjui/easyui 表格分页简单实例
  11. c语言判断闰年并输出该月天数,C语言宏定义实现闰年判断并输出指定月的天数...
  12. 带本科生做毕设是什么样的体验,看看学生是怎么评价我的
  13. 注释大全,神兽护体,佛祖保佑,永无bug
  14. sh报错 [: unexpected operat
  15. android 仿微视,腾讯微视和抖音一样?模仿还是照搬?
  16. Leanback(1)-播放控制栏下添加新的行
  17. 笔记本外接显示器显示器水波纹问题+解决方案
  18. COM操作Excel
  19. 【PyTorch深度学习项目实战100例】—— 基于逻辑回归方法完成垃圾邮件过滤任务 | 第22例
  20. 电力系统为什么是三相的

热门文章

  1. Linux桌面图标锁定不让移动,【电脑小知识】桌面布局被锁定,图标不能随意移动了怎么办?...
  2. react的同步和异步
  3. 30个Python练手项目
  4. 避免HashMap扩容的正确姿势
  5. ajax 多人聊天吧,基于Nodejs利用socket.io实现多人聊天室
  6. 用python输出下列图案_使用Python打印图案“有趣”
  7. Unity递归遍历给定物体的所有子物体
  8. python 遍历列表后保存_Python遍历列表以在asyncio中获取api调用并保存结果
  9. noVNC 安装、配置与使用
  10. Android常见的几个问题及解决方法