当前位置: 首页 > news >正文

Android进阶 ——— Android官方架构组件Lifecycle

初探

Lifecycle是Android官方推出的架构组件,在谷歌开发者官微发布的正式发布 Android 架构组件 1.0 稳定版 | 附带中文介绍视频 简明扼要的阐述了推出的架构组件的作用及使用,也可以查看Android开发者官网。

先来看看架构组件的第一部分Lifecycle。 在长篇大论之前,先要了解它的作用,为什么谷歌要推出Lifecycle?

就是为了解决常见架构模式中,生命周期管理的痛点,例如MVP模式: 为了管理生命周期:

public interface IPresenter {

	void onCreate();

	void onStart();

	void onResume();

	void onPause();

	void onStop();

	void onDestroy();
}

复制代码

继承Ipresenter接口

public class MainPresenter implements IPresenter {

	public void xxx(){
		
	}

	@Override
	public void onCreate() {

	}

	@Override
	public void onStart() {

	}

	@Override
	public void onResume() {

	}

	@Override
	public void onPause() {

	}

	@Override
	public void onStop() {

	}

	@Override
	public void onDestroy() {

	}
}

复制代码

Activity或Fragment中:

/**
 * Created by dai
 * Created time 2018/8/20
 * function:lifecycle.example.com.lifecycleexample
 */

public class MainActivity extends AppCompatActivity {

	private MainPresenter presenter;

	@Override
	protected void onCreate(@Nullable Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		presenter = new MainPresenter();
		presenter.onCreate();
	}


	@Override
	protected void onStart() {
		super.onStart();
		presenter.onStart();
	}

	@Override
	protected void onResume() {
		super.onResume();
		presenter.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
		presenter.onPause();
	}

	@Override
	protected void onStop() {
		super.onStop();
		presenter.onStop();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		presenter.onDestroy();
	}
}
复制代码

需要在Activity的每个声明周期中,依次调用接口IPresenter定义的方法,无疑影响开发效率,更麻烦的是,如果忘记调用声明周期的方法,例如APP被销毁,presenter中依然调用UI层,这必然产生严重后果。

使用

Lifecycle就是为了解决这种重复工作的。先来看看如何使用: 导入Java8依赖

    implementation "android.arch.lifecycle:common-java8:1.1.1"

复制代码

继承DefaultLifecycleObserver

public interface IPresenter extends DefaultLifecycleObserver {

}
复制代码

实现生命周期方法

public class MainPresenter implements IPresenter {

	private final String TAG = this.getClass().getSimpleName();
	public void xxx(){

	}


	@Override
	public void onCreate(LifecycleOwner owner) {
		Log.e(TAG,"oncreate");
	}

	@Override
	public void onStart(LifecycleOwner owner) {
		Log.e(TAG,"start");
	}

	@Override
	public void onResume(LifecycleOwner owner) {
		Log.e(TAG,"resume ");
	}

	@Override
	public void onPause(LifecycleOwner owner) {
		Log.e(TAG,"pause");
	}

	@Override
	public void onStop(LifecycleOwner owner) {
		Log.e(TAG,"stop");
	}

	@Override
	public void onDestroy(LifecycleOwner owner) {
		Log.e(TAG,"destory");
	}
}

复制代码

在Activity中,只需要注册一下,就能完成生命周期的监听

public class MainActivity extends AppCompatActivity {

	private MainPresenter presenter;

	@Override
	protected void onCreate(@Nullable Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		presenter = new MainPresenter();
        //注册
		getLifecycle().addObserver(presenter);
	}

}
复制代码

IPrestener继承DefaultLifecycleObserver,MainPresenter实现IPresenter接口,并实现DefaultLifecycleObserver中定义的方法,可以全部实现,也可以选择需要的生命周期去实现。

了解了Lifecycle的使用,当然也要简单了解一下实现原理,知其然而不知其所以然,不是我们的目的。

原理

1.先了解几个重要的类和接口

  • Lifecycle Lifecycle是一个持有组件生命周期状态(如Activity或Fragment)的信息的类,并允许其他对象观察此状态。
  • Event :从框架和Lifecycle类派发的生命周期事件。这些事件映射到活动和片段中的回调事件。
  • State :由Lifecycle对象跟踪的组件的当前状态。
  • LifecycleOwner (重要)Lifecycle持有者 (例如Activity、Fragment) 实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
  • LifecycleObserver(重要)Lifecycle观察者 实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。

2.LifecycleOwner(Lifecycle持有者)

官网介绍:LifecycleOwner是一个单一的方法接口,表示该类有一个 Lifecycle。它有一个方法,getLifecycle()这个方法 必须由这个类来实现。如果您试图管理整个应用程序进程的生命周期,请参阅 ProcessLifecycleOwner。该接口从各个类(如Fragment和AppCompatActivity)抽象生命周期的所有权,并允许编写与它们一起工作的组件。 任何自定义应用程序类都可以实现LifecycleOwner接口 实现LifecycleObserver的组件与实现LifecycleOwner的组件无缝协作,因为所有者可以提供生命周期,观察者可以注册以观看

简单理解:LifecycleOwner就是一个接口,谁继承了它,就持有了lifecycle对象,可以提供生命周期。 然后可以调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,然后调用addObserver(@NonNull LifecycleObserver observer) 方法来注册监听。 总而言之: 实现该接口的持有者,其生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件

注意:Support Library 26.1.0 及其以后的版本,Activity 和Fragment 已经实现了LifecycleOwner 接口,所以,我们可以直接在Activity 和Fragment中使用getLifecycle()方法来获取lifecycle对象,来添加观察者监听。

3.LifecycleObserver(Lifecycle观察者)

LifecycleObserver 是一个观察者接口,实现了它,可以通过注解或者继承的方式,来管理声明周期的监听。只要在持有lifecycle的类中注册了它,当声明周期发生变化时,它就能收到,进行我们自定义的操作。

简单理解:任何注解或继承实现了该接口,只要在持有Lifecycle的类中注册了,就可以监听到生命周期的变化

两种实现方式: 1)、实现DefultLifecyceObserver接口,然后重写里面生命周期方法; 2)、直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化; Lifecycle.java文档中是建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。DefaultLifecycleObserver是需要另外声明的java8 ,所以上面我们添加了Java8的依赖.

再回顾上面的例子,是不是感觉思路逐渐明朗:

IPrestener继承DefaultLifecycleObserver,MainPresenter实现IPresenter接口,并实现DefaultLifecycleObserver中定义的方法,而Activity默认实现了LifecycleOwner接口,持有声明周期,最后在Activity中调用getLifecycle().addObserver(presenter)注册了LifecycleObserver

相关文章:

  • bzoj1565【NOI2009】植物大战僵尸(最小割)
  • Windows 788
  • node fs
  • 千亿级数量下日志分析系统的技术架构选型
  • 345-反转字符串中的元音字母
  • KVO本质的推导
  • canny算子求图像边缘,edgebox那部分
  • 28.week4
  • SQL中Group By的使用
  • 大数据就业前景怎么样?
  • 商品期货趋势交易策略
  • 版本控制工具Git工具快速入门-Linux篇
  • 计算机网络基础:这是一份详细 HTTP 学习指南
  • 避免MySQL出现重复数据处理方法
  • 强如 Disruptor 也发生内存溢出?
  • 分享的文章《人生如棋》
  • iOS 系统授权开发
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • mockjs让前端开发独立于后端
  • PHP 7 修改了什么呢 -- 2
  • Python十分钟制作属于你自己的个性logo
  • Spark学习笔记之相关记录
  • SQLServer之索引简介
  • Vim Clutch | 面向脚踏板编程……
  • Vue全家桶实现一个Web App
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 每天10道Java面试题,跟我走,offer有!
  • 配置 PM2 实现代码自动发布
  • 嵌入式文件系统
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 试着探索高并发下的系统架构面貌
  • 数据仓库的几种建模方法
  • 温故知新之javascript面向对象
  • 我与Jetbrains的这些年
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用element的upload组件实现多图片上传和压缩
  • # 数据结构
  • #HarmonyOS:软件安装window和mac预览Hello World
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (javascript)再说document.body.scrollTop的使用问题
  • (pytorch进阶之路)扩散概率模型
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .Net Core和.Net Standard直观理解
  • .NET 反射 Reflect
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .Net语言中的StringBuilder:入门到精通
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116