一、前言

为了使开发者能尽快在 Android 平台上开发出高质量的项目,Android 官方推出了 Android Jetpack 项目,旨在从基础,架构,行为以及界面 4 大方面体系化地为我们提供组件级别的支持。当然,在实际开发过程中,我们的旧项目甚至是新项目都不可能完全采用其全部的解决方案。一般来说我们都是各取所需,汲长补短。

我最关注的是其所提供的架构方面的组件, 这一套架构的核心组件Lifecycles、LiveData、ViewModel、Room也被称之为 AAC。通过 AAC + DataBinding+ MVVM 所打造的应用的基础架构,就目前的实践来看,是特别简洁且高效的。对于中小型项目来说,是优秀的可选方案之一。而今天我们要了解的就是 Lifecycles 组件。

二、Lifecyces 基础

Lifecyces 根据官方的解释,是一个生命可感知的组件。如下是官方关于 Lifecycels 的一张功能说明图。

Lifecycels

从图上来看,其主要包括了状态(states)以及事件(events)两个概念,且状态与事件也是一一对应的。

不过,现在看这张图肯定是有一点懵逼的。我们需要通过分解一下官方的 demo 来直观感受一下 Lifecycles 的用法。其过程如下:

1. 实现LifecycleObserver

首先我们需要实现一个 LifecycleObserver,你可以把它等同于观察者模式中的 Observer。在这里,它就是事件的接受收器。而对于每一个不同的事件,则通过在实现类的方法中添加相应的 @OnLifecycleEvent(Lifecycle.Event.xxx) 注解来实现的。具体代码如下所示。

public class MyObserver implements LifecycleObserver {

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)

public void onCreate() {

}

@OnLifecycleEvent(Lifecycle.Event.ON_START)

public void onStart() {

}

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)

public void onResume() {

}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)

public void onPause() {

}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)

public void onStop() {

}

@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)

public void onDestroy() {

}

}

2. 实现 LifecycleOwner

其次就是要实现一个 LifecycleOwner,一般来说就是 Activity 或者 Fragment 来实现是比较合适的。当然,不是这 2 者中的一个,也是可以的,只要你愿意。

public class MyActivity extends Activity implements LifecycleOwner {

@NonNull

@Override

public Lifecycle getLifecycle() {

return null;

}

}

3. 向 LifecycleOwner 注册 LifecycleObserver,建立起两者之间的连接

有了接收事件的观察者/接收者,也有了发送事件的生命周期拥有者/发送者,其不可能平白无故的就建立起连接的。因此,我们需要一个连接者——LifecycleRegistry。一般来说,我们在实现了 LifecycleOwner 的 Activity 中声明它的变量,并在 onCreate() 方法中实例化。然后再通过变量向其添加 LifecycleObserver。如下代码所示。

public class MyActivity extends Activity implements LifecycleOwner {

private LifecycleRegistry mLifecycleRegistry;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mLifecycleRegistry = new LifecycleRegistry(this);

getLifecycle().addObserver(new MyObserver());

}

@NonNull

@Override

public Lifecycle getLifecycle() {

return mLifecycleRegistry;

}

}

4. mark 状态,"发送"事件

接下来,我们需要在其生命周期的方法里,mark 出生命周期的状态以使得其可以产生一个对应的事件发送到 LifecycleObserver 相应的方法上。如下代码所示。

public class MyActivity extends Activity implements LifecycleOwner {

private LifecycleRegistry mLifecycleRegistry;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mLifecycleRegistry = new LifecycleRegistry(this);

mLifecycleRegistry.markState(Lifecycle.State.CREATED);

}

@Override

public void onStart() {

super.onStart();

mLifecycleRegistry.markState(Lifecycle.State.STARTED);

}

......

......

@NonNull

@Override

public Lifecycle getLifecycle() {

return mLifecycleRegistry;

}

}

通过以上 4 个步骤后,以后再也不用逐个逐个在生周期里面去调用相应的 Listener 或者 Controller 了。

三、原理简析

Lifecycels 工作原理图

从原理图上看,以 LifecycleRegistry 为中心,其拥有一个 LifecycleOwner 实例和多个 LifecycleObserver 实例。由 LifecycleOwner 通过 LifecycleRegistry 来 markState ,然后又由其来 dispatch 各个 Event 到所有 LifecycleOwner 的相应事件的方法中。

四、后记

关于 Lifecycles 组件就讲这么多,暂时也不打算涉及到其源码的分析。

最后,感谢你能读到并读完此文章。受限于作者水平有限,如果存在错误或者疑问都欢迎留言讨论。如果我的分享能够帮助到你,也请记得帮忙点个赞吧,鼓励我继续写下去,谢谢。

android新架构,Android新架构组件 LifeCycles 简介相关推荐

  1. Android 金融类项目模块化架构

    一.前言 在以往的开发中,我们通常会使用MVC的模式进行开发,这样导致了Activity处理的逻辑非常的复杂,而且耦合度非常高,代码结构混乱.层次不清,各业务技术方案不统一,冗余代码充斥项目的各个角落 ...

  2. Android从程序员到架构师之路3

    本文学习自高焕堂老师的Android从程序员到架构师之路系列教学视频 40 - 认识线程(Thread)模式a 1. 线程(Thread)概念 所谓线程(Thread) 是指一串连续的执行动作,以达成 ...

  3. 重走Android路 之 Android系统架构图以及开发工具了解

    LZ-Says:热腾腾的一天那,貌似今天帝都达到了高温,热腾腾,我滴天...各位老铁注意防暑,多喝水~~~ 前言 昨天更新了一篇启程文,地址如下: 重走Android路 之 今日正式启程:https: ...

  4. Android display架构分析-SW架构分析(1-8)

    参考: Android display架构分析二-SW架构分析 Android display架构分析三-Kernel Space Display架构介绍 Android display架构分析四-m ...

  5. android视频播放器!毕业一年萌新的Android大厂面经,面试心得体会

    历时半年,我们终于整理出了这份市面上最全面的最新Android面试题解析大全! 章节目录 第一章:Android 基础 面试题 第二章:Android 高级 面试题 第三章:开源框架实战面试解析 第四 ...

  6. Android开发——微信Android架构历史

    微信Android诞生之初,用的是常见的分层结构设计.这种架构简单.清晰并一直沿袭至今.这是微信架构的v1.x时代. 图1-架构演进 到了微信架构的v2.x时代,随着业务的快速发展,消息通知不及时和A ...

  7. chrome怎么运行Android程序,ARCVM:Chrome OS 中运行 Android 应用程序的新方式

    三星可翻转 Chromebook 在过去几年中,许多 Chromebook 都可以安装 Play 商店并运行 Android 应用.这为 Chromebook 打开了新的大门,使其不仅仅是美化的网络浏 ...

  8. 探索Android 9.0 Pie新特性变更

    北京时间 8 月 7 日上午,Google 正式发布 Android 9.0 正式版系统,并宣布系统版本 Android P 被正式命名为代号「Pie」. 目前,Google 已向全球 Pixel 设 ...

  9. 雷军证实小米 13 Ultra 存在;美国最佳雇主百强公布,苹果与 Meta 落榜;Android 13 测实用新功能|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

最新文章

  1. Mac OS Terminal Commands
  2. 使用STC8G1K08制作调频接收模块TEA5767配置电路
  3. Java 代码多线程问题
  4. 软工随堂练 找出和值最小的子数组 尹亚男 赵静娜
  5. 2020年下信息系统项目管理师合格分数线通知
  6. C#微信开发小白成长教程二(新手接入指南,附视频)
  7. android notification 的总结分析
  8. hadoop put命令的格式_HDFS常用命令
  9. JVM分代垃圾回收策略的基础概念
  10. unity如何得到所有子对象_Unity中获取多级子父节点的对象的两种方式
  11. 苹果iBoot源代码
  12. 【DFS】【剪枝】数独(简单版)
  13. c++点餐系统(C++、多态、sqlite数据库)
  14. ue4网格转地形_UE4 山脉风景地形模型
  15. Eclipse(二)如何给 eclipse 设置快捷键
  16. Buffon's Needle An Analysis and Simulation------蒙特卡洛法模拟蒲丰(Buffon)投针实验-使用Matlab
  17. 基于PHP的旅游网站的开发与设计
  18. Servlet[springmvc]引发了load()异常
  19. 伟平在重阳节给深爱的父母鞠一躬
  20. 建立时间保持时间不满足要求怎么办

热门文章

  1. mysql 定时任务实例_mysql定时任务与存储过程实例
  2. id nfc模拟_手机NFC也可以刷ID卡门禁?无聊测试居然成功了
  3. Nearest Opposite Parity(反向建边+spfa)
  4. 蓝桥杯之貌似化学(g背包)
  5. mysql 跨库复制_Mysql跨数据库(在同一IP地址中)复制表
  6. php服务器 下载,php实现从服务器下载文件
  7. activiti高亮显示图片_第 09 篇:让博客支持 Markdown 语法和代码高亮
  8. hashtable允许null键和值吗_MySQL默认值选型是空,还是 NULL-爱可生
  9. java axis webservice_Axis Webservice框架使用案例
  10. 【sklearrn学习】朴素贝叶斯