安卓架构组件实战——Lifecycle

2023-10-27

注:本文涉及代码请看:项目源码

Lifecycle是谷歌推出的一个架构组件,用于感知组件生命周期,并赋予了非组件对象感知生命周期的能力

Lifecycle组件用来响应另一个组件的生命周期状态变化,例如Activity和Fragment,可以帮助非生命周期组件跟Activity、Fragment或Service的生命周期关联在一起,从而在不同生命周期内执行相应操作。其他说明请参考谷歌官网文档Lifecycle

在之前我写了一篇《使用Kotlin+MVP+AndroidX搭建安卓项目框架》,里面使用了MVP的设计模式,在没有使用Lifecycle之前你可以看到在Presenter里面我添加了一堆方法来对应Activity的生命周期,如下:

BasePresenter:

interface BasePresenter {

    fun onCreate()

    fun onStart()

    fun onStop()

    fun onDestory()
}

然后在具体的实现MainPresenter:

class MainPresenter(private val mViewBinder: MainViewBinder?) : BasePresenter {

    override fun onCreate() {}

    override fun onStart() {}

    override fun onStop() {}

    override fun onDestory() {}
}

在Activity/Fragment中调用:

class MainActivity : BaseActivity(), MainViewBinder {

    private val mMainPresenter = MainPresenter(this)

    override val contentView: Int
        get() = R.layout.activity_main

    override fun initView() {
    }

    override fun initData() {
    }

    override fun onStart() {
        super.onStart()
        mMainPresenter?.onStart()
    }

    override fun onStop() {
        super.onStop()
        mMainPresenter?.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
        mMainPresenter?.onDestory()
    }
}

在每个生命周期方法都需写一遍方法关联,一点都不优雅,于是Lifecycle就出现了,使用后:

interface BasePresenter : LifecycleObserver {
    //关联onCreate()
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate(owner: LifecycleOwner)

    //关联onStart()
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onStart(owner: LifecycleOwner)

    //关联onStop()
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onStop(owner: LifecycleOwner)

    //关联onDestroy()
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy(owner: LifecycleOwner)
}
class MainPresenter(private val mViewBinder: MainViewBinder?) : BasePresenter{

    override fun onCreate(owner: LifecycleOwner) {
        LogUtil.i("onCreate()")
    }

    override fun onStart(owner: LifecycleOwner) {
        LogUtil.i("onStart()")
    }

    override fun onStop(owner: LifecycleOwner) {
        LogUtil.i("onStop()")
    }

    override fun onDestroy(owner: LifecycleOwner) {
        LogUtil.i("onDestroy()")
    }
}
class MainActivity : BaseActivity(), MainViewBinder {
    private val mMainPresenter = MainPresenter(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //lifecycle(getLifecycle())在AppCompatActivity已经定义了,直接使用
        lifecycle.addObserver(mMainPresenter)//关联起来
    }
}

这样,Presenter就可以和Activity的生命周期关联起来了。

下面说说使用步骤:

1.引入依赖:

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

如果你项目不是用androidx全家桶,也可以单独引用下面:

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

2.需要关联的对象实现LifecycleObserver接口

class MainPresenter() : LifecycleObserver{}

有两种方法:

  • 实现DefaultLifecycleObserver接口,然后重写里面生命周期方法;androidx默认没有这个,需要引入common-java8版本
  • 实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;

在我的项目源码里面已经写了两种方式,可自行查看

3.在对象的方法内添加对应@OnLifecycleEvent注解:

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
    LogUtil.i("onCreate()")
}

@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart() {
    LogUtil.i("onStart()")
}

4.在Activity/Fragment调用:

 lifecycle.addObserver(mMainPresenter)//关联起来

在MainActivity启动时,日志:

2019-11-28 10:18:58.293 16238-16238/com.king.frame I/king: onCreate()
2019-11-28 10:18:58.298 16238-16238/com.king.frame I/king: onStart()

销毁时:

2019-11-28 10:19:08.092 16238-16238/com.king.frame I/king: onStop()
2019-11-28 10:19:08.094 16238-16238/com.king.frame I/king: onDestroy()

就是这么简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓架构组件实战——Lifecycle 的相关文章

  • Android STFP 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在我的 Android 项目中使用 SFTP 安卓已经有了吗 SFTP 库 还是我必须实现它 I
  • 删除 json 对象字符串中的“\”

    如何删除下面字符串中的特殊字符 String x message content toom recipients id 1000001865 room subject room 我使用了 x replaceAll 但它不起作用 您必须转义正
  • 在Android内存中存储gif图像

    我对安卓还很陌生 我想将图像保存到内存中 然后从内存中检索图像并将其加载到图像视图中 我已使用以下代码成功将图像存储在内存中 void saveImage String fileName img cnt jpg File file new
  • Android中如何将文件写入raw文件夹?

    我认为这是一个非常基本的问题 我目前正在编写这样的文件 File output new File exampleout mid 现在 我想将文件写入 myproject res raw 我读到我可以通过将完整的网址放在 中来做到这一点 但
  • Android/Java 创建辅助类来创建图表

    Goal 创建用于图形生成的辅助类 背景 我有 3 个片段 每个片段收集一些传感器数据 加速度计 陀螺仪 旋转 并使用 GraphView 绘制图表 以下是其中一个片段的代码 该代码当前工作正常 public class Gyroscope
  • Android Accessibility 执行触摸操作

    我想知道是否可以使用 Android 辅助功能服务在屏幕上的位置执行触摸操作 例如 Bundle arguments new Bundle arguments putInt coord X X value arguments putInt
  • Android相当于javascript的setTimeout和clearTimeout?

    setTimeout 有一个答案https stackoverflow com a 18381353 433570 https stackoverflow com a 18381353 433570 它没有提供我们是否可以像在 JavaSc
  • 如何使用表内的 JSONB 数据类型和 PostgreSQL JDBC 驱动程序将 JSON 对象存储到 PostgreSQL 中

    我想将以下 json 对象保存到 PostgreSQL 数据库表中as jsonb fname john lname doe 我当前使用 PGObject 创建对象并将类型设置为 jsonb 并将值作为 json 字符串传递 寻找更好的 m
  • 无法找到/下载 AppCompat-v7:23.1.1

    怎么了 我遇到了很多 找不到 appcompat v7 23 1 1 的问题 许多解决方案都不起作用 经过几个小时的思考和寻找答案 我遇到了一个奇怪的问题 I have gotAndroid 支持库 23 1 1 已安装 所有功能 exce
  • 无法从 com.android.aaptcompiler.ParsedResource@ef79973 提取资源

    无法从 com android aaptcompiler ParsedResource ef79973 提取资源 无法从 com android aaptcompiler ParsedResource 4c95ce87 提取资源 C Use
  • AOSP 中 android.Build.SERIAL 何时何地生成?

    我知道android Build SERIAL是在第一次设备启动时生成的 但我无法准确定位位置和时间 我正在建造AOSP Jelly Bean Android平板电脑 nosdcard 第二个问题 这个是序列号吗 really对所有人来说都
  • 取消通知

    我使用Onesignal推送通知 需要取消所有onPause和onResume的通知 NotificationManager notificationManager NotificationManager getApplicationCon
  • Android 26 (O) 通知不显示操作图标 [重复]

    这个问题在这里已经有答案了 随着 Android 26 O 引入通知渠道 我一直在调查 Google 提供的com example android notificationchannels 这个示例按预期工作 直到我尝试添加Action到示
  • cordova插件条码扫描仪打不开扫描

    我的条形码扫描仪插件有问题 我不是天才 我不太了解如何编写网络应用程序 我使用phonegap和cordova 并且尝试制作一个网络应用程序 在单击链接后扫描条形码 我之前已经使用此命令行安装了该插件 cordova plugin add
  • Android 发布到 facebook 墙,stream.publish 几天来就中断了

    我有很多使用 FB android sdk 发布的应用程序 github com facebook facebook android sdk 我所有使用 FB 的应用程序几天后就停止工作了 这必然是 FB 方面的更改或错误 因为我的应用程序
  • Android - 正确使用 invalidateOptionsMenu()

    我一直在寻找很多invalidateOptionsMenu 我知道它的作用 但我想不出这种方法在现实生活中有用的任何例子 我的意思是 例如 假设我们要添加一个新的MenuItem to our ActionBar 我们可以简单地获取菜单on
  • 在尝试使用 GPS 之前如何检查 GPS 是否已启用

    我有以下代码 但效果不好 因为有时 GPS 需要很长时间 我该如何执行以下操作 检查GPS是否启用 如果启用了 GPS 请使用 GPS 否则请使用网络提供商 如果 GPS 时间超过 30 秒 请使用网络 我可以使用时间或 Thread sl
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 从多个 TextView 中选择文本

    如何在android中从多个文本视图中选择文本 我已经尝试过以下代码 该代码一次仅适用于一个文本视图 我想一次性从许多文本视图中复制文本 android textIsSelectable true 你不能同时这样做 您需要在单个文本视图中设
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library

随机推荐

  • 云服务器磁盘扩容后不显示,腾讯云服务器磁盘扩容问题小记

    操作系统 CentOS 7 2 文件类型 ext3 磁盘扩容前 一定要先做磁盘快照备份 1 卸载挂载点报错 umount dev vdb1 umount u01 target is busy In some cases useful inf
  • dclode mui.ajax无法发送跨域请求,type为abort

    前台 mui的ajax代码 后台java spring boot代码 后来得知原因是不能使用localhost和127 0 0 7需要使用本机的IP地址 且手机和电脑要连同一无线 修改ip地址后 程序正常 且需要注意 json要为大写 Js
  • 一道有关路由器的实验题 寻找前辈指导

    如图所示 使用Dynamips搭建网络环境由路由器R1 R5构成 路由器PC模拟PC机 R1 R2上配置Loopback地址 好像我的这个拓扑图无法显示 不过我把拓扑图传到附件那里了 如果有乐于助人的好前辈的话 那还的麻烦您把它下载来看看
  • ArrayList、ArrayDeque与LinkedList区别

    ArrayList ArrayDeque与LinkedList区别 ArrayList ArrayDeque内部以数组的形式保存集合中的元素 因此随机访问元素时有较好的性能 而LinkedList内部以链表的形式来保存集合中的元素 因此随机
  • 平均值不等式的证明

    平均值不等式的证明 需要证明的结论 对任意 n n n个正数 a 1
  • 【华为OD机试真题 JS】停车场车辆统计

    标题 停车场cars 数组表示 其中值1为有车 0为无车 车有三种大小 小车占位1 卡车占位2 货车占位3 求最少可以停多少车 输入描述 输入 整型字符串数组cars 其中1表示有车 0表示没车 数组长度小于1000 输出 整型数字字符串
  • 泛微为什么大量招人_OA市场增长乏力 泛微未来靠什么取胜?

    上周 泛微网络发布了其2019年中期财报 营收和利润均获得增长 财报显示 2019 年上半年 公司共实现营业收入 50 494 62 万元 同比增长 25 96 实现归母净利润 4 919 37 万元 比上年同期增加 35 70 尽管收入增
  • Go(五)数组

    目录 Array 数组 数组定义 数组的初始化 方法一 方法二 方法三 数组的遍历 多维数组 二维数组的定义 二维数组的遍历 数组是值类型 Array 数组 数组是同一种数据类型元素的集合 在Go语言中 数组从声明时就确定 使用时可以修改数
  • 常见凭证获取方法

    常见凭证获取方法 Windows下凭证获取 系统密文数据 原理介绍 SAM系统安全账号管理 是微软设计的一个安全机制 为了保护账号以及密码的安全性 路径是C windows system32 config SA 该文件是无法修改和删除的 它
  • Balanced Ternary String【Codeforces Round #531 (Div. 3)D】【贪心、构造】

    题目链接 一道简单的构造 我们可以分成几个状态 因为所有的状态只有8个 所以 直接写每个状态即可 哎 被hack了 烦啊 谁让我写的好烂 好菜啊 呜呜呜 include
  • 云服务器一直显示关机中,云服务器一直提示关机中

    云服务器一直提示关机中 内容精选 换一换 云服务器组是对云服务器的一种逻辑划分 云服务器组中的弹性云服务器遵从同一策略 当前仅支持反亲和性 即同一云服务器组中的弹性云服务器分散地创建在不同的主机上 提高业务的可靠性 您可以使用云服务器组将业
  • 适合上班族的兼职有哪些?上班族兼职赚钱项目

    上班族如何赚外快 其实上班族压力很大的 表面看起来衣着得体 出入高端写字楼 但一个月到手的几千元工资除去房租水电生活车马费后 基本上余不下什么钱 更别谈买车买房了 所以很多上班族都想知道 如何利用业余时间兼职钱 今天理想青年工作室就为大家分
  • Unity3D-Shader之两张图片叠加并且通过颜色调控

    最近项目需要做一个图片叠加在一个模型上 而且还需要通过调整颜色改变两个图片的颜色和透明程度 另外 还需要一个调控值 管理两张图片是否完全显示 Shader如下 Shader Unlit BlockTextrue Properties Mai
  • Nginx & 详细举例 location -> index、return、rewrite、try_files、alias 各个属性的含义和注意事项

    1 准备工作 1 1 本案例以 centos7 系统作为演示 配置文件在 etc nginx conf d test conf 中 内容如下 server listen 8000 server name 127 0 0 1 root hom
  • 【MindSpore】一种参数归一化实现方式

    1 功能描述 MindSpore实现WeightNorm参数归一化 2 实现分析 在MindSpore实现高性能方案 建议采用图模式 同时也能保证动静统一 MindSpore图模式需要把归一化操作表达到整图里 可以采用自定义的方式在网络结构
  • Mairadb数据库的备份和恢复

    Mairadb数据库的备份和恢复 一 检查数据库状态 1 检查mariadb的服务状态 2 测试进入mariadb数据库 二 配置二进制日志功能 1 修改 etc my conf 2 重启服务 3 查看二进制日志文件 4 查看binlog开
  • chrome浏览器设置广告拦截器-Adblock Plus

    1 点击下面 chrome 网上应用店 Adblock Plus 的插件链接地址 https chrome google com webstore detail adblock plus free ad bloc cfhdojbkjhnkl
  • 【个人记录】bert初步学习

    目的 背景 使用医疗方面的bert模型 进行实体识别和医患匹配 参考 如何快速使用BERT 知乎 zhihu com tensorflow版本与python版本不相容的问题 fltenwall的博客 CSDN博客 中文医疗预训练模型 MC
  • ICLR 2022

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 CrossFormer A Versatile Vision Transformer Based on Cross scale Attention CrossForme
  • 安卓架构组件实战——Lifecycle

    注 本文涉及代码请看 项目源码 Lifecycle是谷歌推出的一个架构组件 用于感知组件生命周期 并赋予了非组件对象感知生命周期的能力 Lifecycle组件用来响应另一个组件的生命周期状态变化 例如Activity和Fragment 可以