Android框架组件Lifecycle的使用详解

Android_Jetpack:LifeCycle在Activity/Fragment、Service以及Application中的应用 Android_Jetpack:LifeCycle在Activity/Fragment、Service以及Application中的应用一、使用LifeCycle解耦Activity/Fragment与组件二、使用LifeCycleService解耦Service与组件三、使用ProcessLifecycleOwner监听应用程序的生命周期 最近重新捡起了Android开发,对Jetpack很感兴趣,就专门研究了下。这篇主要讲的就是系统组件与普通组件解耦的LifeCycle。LifeCycle可以帮助开发者 阅读详情

1.前言

Lifecycle是Google推出的一系列的框架组件的其中一个,主要是用来感知Activity和Fragment的生命周期。

本文主要介绍如何使用Lifecycle。

2.一个常见的开发例子

代码语言:javascript

public class TestActivity extends Activity{
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    xxx.onCreate();
  }

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

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

通常,我们都会写出一些类似上面的代码来监听生命周期。如果有太多这样的调用将会使某个生命周期方法变的非常臃肿。如下一段例子:

代码语言:javascript

  @Override
  protected void onStart() {
    super.onStart();
    xxx.onStart();
    xxx1.onStart();
    xxx2.onStart();
    //...
    }

Lifecycle组件能够解决这个问题,从而使代码能够写得更优雅。

3.Lifecycle使用例子

下面来看下如何使用Lifecycle。

3.1 添加依赖

在相应的moudle目录下的build.gradle中添加以下依赖:

代码语言:javascript

dependencies {
  //...
  def lifecycle_version = "1.1.1"
  implementation "android.arch.lifecycle:runtime:$lifecycle_version"
}

3.2 实现LifecycleObserver接口

代码语言:javascript

public class TestLifeCycle implements LifecycleObserver {
  private static final String TAG = "test";

  @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
  public void onCreate() {
    Log.d(TAG, "onCreate: ");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_START)
  public void onStart() {
    Log.d(TAG, "onStart: ");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
  public void onResume() {
    Log.d(TAG, "onResume: ");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
  public void onPause() {
    Log.d(TAG, "onPause: ");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
  public void onStop() {
    Log.d(TAG, "onStop: ");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
  public void onDestroy() {
    Log.d(TAG, "onDestroy: ");
  }

  @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
  public void onAny() {
    Log.d(TAG, "onAny: ");
  }
}

通过实现LifecycleObserver接口,然后在相应的方法上面添加注解@OnLifecycleEvent(Lifecycle.Event.XXX)即可。实际上,这就是一个观察者。当执行到某个生命周期时,会通知观察者执行对应的方法。

3.3 Activity中添加观察者

代码语言:javascript

public class TestActivity extends AppCompatActivity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_activity);
    getLifecycle().addObserver(new TestLifeCycle());
  }
}

继承AppCompatActivity后,即可通过添加观察者来监听此Activity的生命周期了。相比第2小节的例子,只要一句话就完事,是不是简单多了呢。到这里,Lifecycle的简单使用例子就完成了。

我们先来看下一个完整的生命周期的输出结果:

07-24 23.23:55.892 15728-15728/com.test.start D/test: onCreate: 07-24 23.23:55.892 15728-15728/com.test.start D/test: onAny: 07-24 23.23:55.893 15728-15728/com.test.start D/test: onStart: 07-24 23.23:55.893 15728-15728/com.test.start D/test: onAny: 07-24 23.23:55.895 15728-15728/com.test.start D/test: onResume: 07-24 23.23:55.895 15728-15728/com.test.start D/test: onAny: 07-24 23.23:58.183 15728-15728/com.test.start D/test: onPause: 07-24 23.23:58.184 15728-15728/com.test.start D/test: onAny: 07-24 23.23:58.576 15728-15728/com.test.start D/test: onStop: 07-24 23.23:58.577 15728-15728/com.test.start D/test: onAny: 07-24 23.23:58.585 15728-15728/com.test.start D/test: onDestroy: 07-24 23.23:58.586 15728-15728/com.test.start D/test: onAny:

可以看到,onAny是每个生命周期都会调用到一次。其他的话,就是正常调用。

注意,目前只能通过继承AppCompatActivity来实现这种简单的方式,直接继承Activity的话稍复杂,祥见后面的分析,暂且不表。

3.4 Fragment中添加观察者

代码语言:javascript

public class TestFragment extends Fragment {
  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getLifecycle().addObserver(new TestLifeCycle());
  }
}

同样,也可以监听到Fragment的生命周期,加一个观察者即可。

4. Lifecycle角色说明

4.1 Lifecycle类

Lifecycle类持有Activity 或 Fragment等组件的生命周期信息,并且允许其他对象观察这些信息。

Lifecycle内部使用了两个枚举来跟踪其关联组件的生命周期状态:Event和State。祥见下面分析。

可以通过调用Lifecycle类的addObserver()方法来添加观察者,如下:

代码语言:javascript

getLifecycle().addObserver(new TestLifeCycle());

4.2 Lifecycle事件

Lifecycle组件可以感知如下事件:

代码语言:javascript

public abstract class Lifecycle {
  public enum Event {
    ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY,ON_ANY
  }
}

看起来有7种,实际上也就是6种而已。ON_ANY表示所有的事件都会感知。可以看到,像Activity的onRestart() ,Fragment的onCreateView()等等其他生命周期是无法感知的。

4.3 Lifecycle状态

Lifecycle组件内部维护了一个State来标识Activity或Fragment当前的状态。如下:

代码语言:javascript

public abstract class Lifecycle {
  public enum State {
    DESTROYED,
    INITIALIZED,
    CREATED,
    STARTED,
    RESUMED;

    public boolean isAtLeast(@NonNull State state) {
      return compareTo(state)  = 0;
    }
  }
}

一共也就5种状态而已,其状态和事件的状态关系如下图所示:

img

4.4 LifecycleOwner接口

LifecycleOwner表示它的实现类具有一个 Lifecycle。它有一个 getLifecycle()方法,该方法必须由实现类实现。

AppCompatActivity和Fragment都实现了LifecycleOwner接口(Support Library 26.1.0之后的版本),所以可以直接拿来使用。

但是Activity类并没有实现LifecycleOwner接口,所以,如果我们需要去监听自定义Activity的话,需要自己手动去实现LifecycleOwner接口。详见后面分析。

4.5 LifecycleObserver接口(观察者)

LifecycleObserver其实现类可以通过感知相应的生命周期来完成特定的操作。可以看前面的例子实现。

5. 自定义Activity中实现LifecycleOwner

感知AppCompatActivity和Fragment的子类生命周期都很简单,一行代码就可以完成了。但是感知自定义Activity就稍微复杂了点,实现我们手动去完成以下步骤:

  1. 实现LifecycleOwner接口
  2. 重写getLifecycle()方法
  3. 手动标记生命周期的状态

其代码如下所示:

代码语言:javascript

public class TestActivity extends Activity implements LifecycleOwner {
  private LifecycleRegistry mLifecycleRegistry;

  @NonNull
  @Override
  public Lifecycle getLifecycle() {
    //返回Lifecycle
    return mLifecycleRegistry;
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test_activity);
    //创建Lifecycle对象
    mLifecycleRegistry = new LifecycleRegistry(this);
    //标记状态
    mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    //添加观察者
    getLifecycle().addObserver(new TestLifeCycle());
  }
  
  @Override
  public void onStart() {
    super.onStart();
    //标记状态
    mLifecycleRegistry.markState(Lifecycle.State.STARTED);
  }

  @Override
  protected void onResume() {
    super.onResume();
    //标记状态
    mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    //标记状态
    mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
  }
}

上面的LifecycleRegistry其父类是Lifecycle。

6. 其他

本文主要介绍Lifecycle的使用,相关的原理和源码分析就先不说了。后面有时间再补充~

更多Android进阶指南 可以扫码 解锁 《Android十大板块文档》

1.Android车载应用开发系统学习指南(附项目实战)

2.Android Framework学习指南,助力成为系统级开发高手

3.2024最新Android中高级面试题汇总+解析,告别零offer

4.企业级Android音视频开发学习路线+项目实战(附源码)

5.Android Jetpack从入门到精通,构建高质量UI界面

6.Flutter技术解析与实战,跨平台首要之选

7.Kotlin从入门到实战,全方面提升架构基础

8.高级Android插件化与组件化(含实战教程和源码)

9.Android 性能优化实战+360°全方面性能调优

10.Android零基础入门到精通,高手进阶之路

敲代码不易,关注一下吧。ღ( ´・ᴗ・` ) 🤔

带你详细了解 Android Lifecycle Lifecycle 一个跟踪组件生命周期的东西 阅读详情

相关推荐

Android架构组件Lifecycle详解

Lifecycle是Android Jetpack架构组件之一,主要解决Android开发中的生命周期管理问题。在传统的Android开发中,Activity和Fragment的生命周期管理往往较为复杂,容易产生内存泄漏和崩溃等问题。Lifecycle组件的出现,为开发者提供了一种简洁、高效的解决方案。本文详细介绍了Android架构组件Lifecycle的原理、使用方法、应用场景和与其他组件的整合。

2501_92487990的博客 575

Android: 彻底搞懂Lifecycle——使用篇

你真的了解lifecycle吗?本文的目标就是要“打破砂锅问到底”,带你真真切切了解它。lifecycle 是属于Android Jetpack(官方开发工具包)—— Architecture(架构组件)中的一员。 【官方介绍】构建生命周期感知型组件,这些组件可以根据 Activity 或 Fragment 的当前生命周期状态调整行为。 【白话】lifecycle可以和Activity或Fragment生命周期绑定,方便我们做一些跟生命周期相关的业务逻辑。 【应用场景】【示例】为了方便李(理)姐(解),下

小小小石头的专栏 1万+

Android生命周期组件Lifecycle使用详解

Override@Override@Override如果我们把很多这种需要跟生命周期相关的逻辑代码都直接放在 Activity 的生命周期方法中,Activity 将会变得难以维护。通过 Lifecycle,我们就能避免这种问题。因为本质上我们需要的只是 Activity 或者 Fragment 的生命周期发生改变的时候能通知到我们,以便我们在对应生命周期中执行对应的方法。

2401_84121998的博客 1335

Android框架组件--Lifecycle的使用

1.前言 Lifecycle是Google推出的一系列的框架组件的其中一个,主要是用来感知Activity和Fragment的生命周期。 本文主要介绍如何使用Lifecycle。 2.一个常见的开发例子 public class TestActivity extends Activity{ @Override protected void onCreate(@Nulla...

四月葡萄的博客 6521

Jetpack 之 LifeCycle 组件使用详解

一、LifeCycle 简介 LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。 LifeCycle 的出现主要是为了解决: 系统组件的生命周期与普通组件之间的耦合性。 系统组件指:Activity/Fragment、Service 和 Application。 普通组件指:将代码按照功能或者作用封装成

鸿蒙开发知识记录 2822

Android Jetpack 之 LifeCycle 组件使用详解

一、LifeCycle 简介 LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。 LifeCycle 的出现主要是为了解决: 系统组件的生命周期与普通组件之间的耦合性。 系统组件指:Activity/Fragment、Service 和 Application。 普通组件指:将代码按照功能或者作用封装成

m0_62167422的博客 935

Android MVVM模式

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34163553的博客 98

极路由 极1s J1S hc5661 刷padavan固件

极路由1S刷机指南 准备工作: 下载Breed不死固件 通过WinSCP上传或直接wget获取 执行mtd命令写入Breed 关键步骤: 进入Breed控制台(按住Reset键开机) 备份原厂固件和密钥 下载Padavan固件(RT-N14U-GPIO-12-xiaodu-ji1S-128M.trx) 刷机过程: 在Breed控制台更新固件 等待自动重启完成 初始设置: 管理地址:192.168.123.1 默认账号:admin/admin 无线名称:PCDN 无线密码:1234567890 注意事项:切勿

SimonLiu的博客 1302

Android官方架构组件:Lifecycle详解&原理分析

Lifecycle详解&原理分析

QG 706

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 252

ABAP ALV编辑后触发事件

1.FUNCTION ALV在it_events的参数中,写入对应的事件。2.OO ALV和FUNCTION ALV都可以,注册当前ALV的事件,对应的事件需要创建对象去实现。下面代码中,实现的是第一种,在it_events中写入事件。下面的代码是通过创建对象去实现ALV事件。

a86632678的博客 3852

jetpack原理分析(lifecycle、viewmodel、livedata小结)

lifecycle、viewmodel、livedata原理小结~

hongli_sun的博客 848

MAX31855电路和程序,实现SPI和软件模拟时序两种方式读取数据

1. 概述 MAX31855为热电偶至数字输出转换器,内置14位模/数转换器(ADC)。器件带有冷端补偿检测和修正、数字控制器、SPI兼容接口,以及相关的控制逻辑,在温度控制器、过程控制或监测系统中设计用于配合外部微控制器(μC)工作。提供多个版本的器件,每个版本针对特定的热电偶类型(K、J、N、T或E型)进行优化和调整。热电偶类型以器件型号后缀表示(例如MAX31855K)。 器件输出14位...

睿思派克 1万+

Android lifecycle 使用详解

ArchiteComponentsSample 简介 Architecture Components lifecycle 是 2107 年 google 大会推出来的,它属于 architecture compoment 里面的一个组件,它可以干什么用呢? 简单得来说,它可以用来检查 Activity 的生命周期,而不必强依赖 Activity。 为什么要引进 lifecycle 举一下...

徐公,微信公众号同名 2万+

初识数据结构之入门必懂——线性表(顺序表)

本文将介绍数据结构中的线性表与线性表中最简单的结构——顺序表

m0_64705485的博客 905

STM32 IIC温湿度传感器(STH45)实验

精度 ΔRH = ±1.0 %RH, ΔT = ±0.1 °C• 平均电流:0.4 μA,空闲电流:80 nA• I2C FM、CRC 校验和、乘法。I2C 地址。• 专利保护选项 [1]、PTFE 膜和可拆卸保护盖• 工作范围:0 …100 %相对湿度,−40…125 摄氏度• 在冷凝环境中功能齐全• 动力加热器,真正的NIST可追溯性• JEDEC JESD47 认证 • 符合 ISO 17025 : 2017 的传感器专用校准证书,3 点温度校准。

baidu_34971492的博客 3072

【Android】Jetpack组件之LifeCycle

Lifecycle组件是Android Jetpack架构组件之一,它提供了一种方法来管理Android组件(如Activity、Fragment和服务)的生命周期。Lifecycle组件帮助你执行与生命周期相关联的操作,确保在适当的时间发生适当的事情,例如,当你的应用进入后台时停止数据刷新,或者在应用回到前台时更新UI。

2301_79828182的博客 1675

【100%通过率】华为OD机试真题 Java&Go 实现【查找单入口空闲区域】【2022.11 Q4 新题】

给定一个 m xn 的矩阵,由若干字符 和0构成,X表示该处已被占据,0"表示该处空闲,请找到最大的单入口空闲区域.解释:空闲区域是由连通的O组成的区域,位于边界的0可以构成入口,单入口空闲区域即有目只有一个位于边界的0作为入口的由连通的'O"组成的区域。 如果两个元素在水平或垂直方向相邻,则称它们是“连通”的。

MISAYAONE的博客 2万+

Android架构之LifeCycle组件

LifeCycle的简介 LifeCycle可以帮助开发者创建可感知生命周期的组件。这样,组件便能够在其内部管理自己的生命周期,从而降低模块间的耦合度,并降低内存泄漏发生的可能性 为什么要引入LifeCycle 举个例子,我们经常需要在页面的onCreate()方法中对组件进行初始化,在onPause()方法中停止组件,而在页面的onDestroy()方法中对组件进行资源回收工作。这样的工作非常烦琐,会让页面与组件之间的耦合度变高。但这些工作又不得不做,因为这可能会引发内存泄漏。 假设有这样一个常见的需求:

qq_43404873的博客 6900

Hermes Agent 常见报错排查与问题解决

Hermes Agent 常见报错排查指南 摘要 本文全面梳理了 Hermes Agent 使用过程中的10类常见报错,按阶段划分为安装期、运行期认证类、后端基础设施类和长任务执行类四大类,并提供了系统化的排查流程: 安装期问题:包括命令未找到和Python版本不兼容,主要检查PATH环境和Python版本是否符合要求 认证类问题:涉及API Key认证失败和速率限制,需要验证密钥配置和配额状态 基础设施问题:包含Docker报错、MCP连接失败和OAuth令牌过期,需检查相关服务状态 执行类问题:主要是上

简简单单Onlinezuozuo 1346

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Android判断定位功能是否可用的方法
下一篇: 程序员就业现状分析:2024年黄金机遇与挑战并存
Agent学习路线
博客等级 码龄6年 1万+粉丝 1903原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值