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

一起Talk Android吧(第三百八十八回:lifecycle)

文章目录

  • 概念介绍
  • 使用方法
    • 1.添加依赖
    • 2.创建Lifecycle对象
    • 3.添加Lifecycle对象到Activity或者Fragment中

各位看官们,大家好,上一回中咱们说的是LiveData的例子,这一回中咱们介绍的例子是lifecycle。闲话休提,言归正转,让我们一起Talk Android吧!

概念介绍

看官们,Lifecycle是Jetpack库中的一部分,它主要用来监听Activity和Fragment的生命周期,官方文档中称其为生命周期感知组件,其实我们在前面章回中介绍过的ViewModelLiveData也是生命周期感知组件。

有看官提问:Activity的生命周期回调函数(onCreate等)机制就能感知到Activity的生命周期呀,为什么还要使用Lifecycle去感知Activity的生命周期?回答是:它可以把生命周期相关的逻辑从Activity中分离出来,让Activity专注于业务功能,这样有助于代码解耦。

Lifecycle对Activity生命周期和感知以事件的形式体现出来,比如Activity为Created状态时Lifecycle的监听事件为ON_CREATE,Activity的每个状态在Lifecycle中都有对应的监听事件,其对应关系如下图所示:(这是官方文档中的截图)

在这里插入图片描述

使用方法

明白Lifecycle的概念后我们介绍它的使用方法,还是使用文字结合代码的风格来介绍。

1.添加依赖

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

2.创建Lifecycle对象

首先自定义一个类,实现LifecycleEventObserver接口,并且重写接口中的onStateChanged()方法,具体代码如下:

public class LifecycleObserverEx implements LifecycleEventObserver {
    private static final String TAG="LifeObservEx";

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        Log.d(TAG, "onStateChanged: state: "+event.toString());
    }
}

在上面的代码中,自定义类重写了接口中的onStateChanged()方法,通过该方法的第二参数获取到被监听对象(Activity/Fragment)的生命周期,与生命周期对应的是ON_XXX等事件,我们在程序中通过Log输出了Lifecycle监听到的事件,大家可以自动动手来观察。

创建Lifecycle对象还有另外一种方法:实现DefaultLifecycleObserver接口,具体的代码如下:

public class LifecycleObserverEx implements DefaultLifecycleObserver {
    private static final String TAG="LifeObservEx";
    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onCreate(owner);
        Log.d(TAG, "onCreate: ");
    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStart(owner);
        Log.d(TAG, "onStart: ");
    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onResume(owner);
        Log.d(TAG, "onResume: ");
    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onPause(owner);
        Log.d(TAG, "onPause: ");
    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onStop(owner);
        Log.d(TAG, "onStop: ");
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        DefaultLifecycleObserver.super.onDestroy(owner);
        Log.d(TAG, "onDestroy: ");
    }

}

这种方法中Lifecycle监听到的生命周期状态不再是ON_XXX事件,而是和Activity中onXXX回调方法一样的回调方法。这个方法相信大家都很熟悉。我们不再详细介绍,大家可以自动手去实践,如果可以打印出代码中的log,说明Lifecycle已经监听到Activity的生命周期状态了。

3.添加Lifecycle对象到Activity或者Fragment中

使用Lifecycle类的addObserver()方法把步骤2中创建的Lifecycle对象添加到Activity/Fragment中,通常是在onCreate()方法中添加,详细代码如下:

getLifecycle().addObserver(new LifecycleObserverEx());

代码中通过getLifecycle()方法可以获取到Lifecycle类型的对象,这个操作大家可能不理解,其实可以把Activity或者Fragment当作是Lifecycle对象,具体的原因我们可以通过下面的继承树看出来

androidx.activity.ComponentActivity implements LifecycleOwner(getLifecycle()是此接口中的方法)androidx.fragment.app.FragmentActivityandroidx.appcompat.app.AppCompatActivity
   ↳ xxxActivity

看官们,关于Android中让lifecycle的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!

相关文章:

  • 直流无刷电机FOC控制算法 理论到实践 —— 实践
  • 初级程序员必会的java反射教程
  • JS学习762~780(注册事件+删除事件+DOM事件流+事件对象+阻止事件冒泡+事件委托鼠标事件+键盘事件)
  • 【华为机试真题Java】滑动窗口最大值
  • Triton测试
  • 监控文件事件
  • 【Node.js】官网学习笔记
  • 番茄ToDo语句精选
  • 树状数组。 数组修改某个元素的数值/求出前n个元素的和,需要在一百毫秒处理上百万个数字
  • 【操作系统】第一章 计算机系统概述
  • 【Vue】Vue的Mustache插值语法、v-bind指令
  • Android7.1.1系统,Toast的Exception: android.view.WindowManager$BadTokenException解决
  • TiKV 监控指标详解
  • 嵌入式系统开发笔记92:感受开源之美
  • VLC 编译安装 [for android, linux, windows]
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • canvas 五子棋游戏
  • ES6系列(二)变量的解构赋值
  • es的写入过程
  • extract-text-webpack-plugin用法
  • gulp 教程
  • Java到底能干嘛?
  • mysql常用命令汇总
  • Promise初体验
  • PV统计优化设计
  • spring security oauth2 password授权模式
  • vue数据传递--我有特殊的实现技巧
  • zookeeper系列(七)实战分布式命名服务
  • 聊聊flink的BlobWriter
  • 每天10道Java面试题,跟我走,offer有!
  • 试着探索高并发下的系统架构面貌
  • 网页视频流m3u8/ts视频下载
  • 协程
  • 源码安装memcached和php memcache扩展
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • # .NET Framework中使用命名管道进行进程间通信
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • ###C语言程序设计-----C语言学习(6)#
  • #define,static,const,三种常量的区别
  • #window11设置系统变量#
  • #微信小程序(布局、渲染层基础知识)
  • %@ page import=%的用法
  • (11)MSP430F5529 定时器B
  • (26)4.7 字符函数和字符串函数
  • (7)svelte 教程: Props(属性)
  • (附源码)ssm高校实验室 毕业设计 800008
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一一四)第九章编程练习
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)原始图像数据和PDF中的图像数据
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)