Jetpack学习之Lifecycle

2023-11-04

  Jetpack是Google为了解决Android架构问题而引入的,Google官方说的说法:“Jetpack是一套库、工具和指南,可以帮助开发者更轻松地编写应用程序。Jetpack中的组件可以帮助开发者遵循最佳做法、摆脱编写样板代码的工作并简化复杂的任务,以便他们能将精力集中放在业务所需的代码上。”
  Jetpack主要包括4个方面,分别是架构(Architecture)、界面(UI)、行为(Behavior)和基础(Foundation)。
在项目中的gradle.properties文件中,

//是否使用AndroidX
android.useAndroidX=true
//是否将第三方库迁移到AndroidX
android.enableJetifier=true
Lifecycle

  Lifecycle用来帮助开发者创建可感知生命周期的组件,使组件能够在其内部管理自己的生命周期,从而降低模块间的耦合度。
  Jetpack提供了两类:LifecycleOwner(被观察者)和LifecycleObserver(观察者),即通过观察者模式,实现对页面生命周期的监听。
  通过查看ComponentActivity源码,在最新的SDK包中,已经默认实现了LifecycleOwner接口。LifecycleOwner接口中只有一个getLifecycle(LifecycleObserver observer)方法,通过此方法实现了观察者模式。

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
        private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
        /**
     * {@inheritDoc}
     * <p>
     * Overriding this method is no longer supported and this method will be made
     * <code>final</code> in a future version of ComponentActivity. If you do override
     * this method, you <code>must</code>:
     * <ol>
     *     <li>Return an instance of {@link LifecycleRegistry}</li>
     *     <li>Lazily initialize your LifecycleRegistry object when this is first called.
     *     Note that this method will be called in the super classes' constructor, before any
     *     field initialization or object state creation is complete.</li>
     * </ol>
     */
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}
使用方法
  1. 编写组件类实现LifecycleObserver接口
  2. 使用@OnLifecycleEvent(Lifecycle.Event.ON_XXX)注解对方法进行标识
import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent

class MyLifecycleObserver(tag: String) : LifecycleObserver {

    private val TAG = tag

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private fun onCreate() {
        Log.d(TAG, "onCreate")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    private fun onStart() {
        Log.d(TAG, "onStart")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private fun onResume() {
        Log.d(TAG, "onResume")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private fun onPause() {
        Log.d(TAG, "onPause")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    private fun onStop() {
        Log.d(TAG, "onStop")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private fun onDestroy() {
        Log.d(TAG, "onDestroy")
    }
}
  1. 在Activity/Fragment中引用组件,使用getLifecycle.addObserver()方法将Acitivyt/Fragment与组件绑定起来。
class MainActivity : AppCompatActivity() {
    private val myLifecycleObserver = MyLifecycleObserver(MainActivity::class.java.simpleName)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(myLifecycleObserver)
    }
}
  1. 在Service中使用Lifecycle
  • 添加依赖:implementation ‘androidx.lifecycle:lifecycle-extensions:2.2.0’
  • 创建自己的Service类继承LifecycleService
  • 在Service中引用组件类并进行绑定
import androidx.lifecycle.LifecycleService
class MyLifecycleService(): LifecycleService() {
    private var name: String = MyLifecycleService::class.java.simpleName
    private val myLifecycleObserver = MyLifecycleObserver(name)
    init {
        lifecycle.addObserver(myLifecycleObserver)
    }
}
  1. 使用ProcessLifecycleOwner监听应用程序的生命周期
  • 添加依赖:implementation ‘androidx.lifecycle:lifecycle-extensions:2.2.0’
  • 在Application的onCreate中添加ProcessLifecycleOwner.get().lifecycle.addObserver()绑定
import android.app.Application
import androidx.lifecycle.ProcessLifecycleOwner
class MyApplication: Application() {
    private val myLifecycleObserver = MyLifecycleObserver(MyApplication::class.java.simpleName)

    override fun onCreate() {
        super.onCreate()
        ProcessLifecycleOwner.get().lifecycle.addObserver(myLifecycleObserver)
    }
}

针对ProcessLifecycleOwner的使用需要注意几点:

  • ProcessLifecycleOwner是针对整个应用程序的监听,与Activity数量无关
  • Lifecycle.Event.ON_CREATE只会被调用一次,而Lifecycle.Event.ON_DESTROY永远不会被调用
  • 当应用程序从后台回到前台,或者应程序被首次打开时,会依次调用Lifecycle.Event.ON_START和Lifecycle.Event.ON_RESUME
  • 当应用程序从前台推到后台(用户按下Home键或任务菜单键),会依次调用Lifecycle.Event.ON_PAUSE和Lifecycle.Event.ON_STOP。这两个方法的调用会有一定的延后,系统需要为“屏幕旋转,由于配置发生变化而导致Activity重新创建”的情况预留一些时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack学习之Lifecycle 的相关文章

随机推荐

  • node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    VScode Code Runner无法运行JavaScript js文件 原因 未安装Node js 解决方法 https nodejs org en 下载Nodejs 安装完之后 重启VScode 会自动配置 运行即可在终端看到结果
  • 【tauri】tauri的启动、运行与打包过程步骤

    兼容性 win11 系统 自带 WebView2 win10 安装完会自动安装WebView2 win7 需要先手动来装WebView2 开始安装 安装node 推荐用nvm将进行node版本管理 安装vs 生成工具 下载地址 https
  • 单片机 嵌入式 毕业设计题目选题推荐

    文章目录 1前言 2 如何选题 2 1 不要给自己挖坑 2 2 难度把控 2 3 如何命名题目 3 单片机 嵌入式 选题大全 3 1 嵌入式方向 3 2 算法方向 3 3 移动通信方向 3 4 学长作品展示 4 最后 1前言 近期不少学弟学
  • 子类的构造函数和析构函数

    1 构造函数是否可以被继承 子类可以继承父类的所有成员变量和成员函数 但不能继承父类的构造函数 因此 在创建子类对象时 为了初始化从父类继承来的数据成员 系统需要调用其父类的额构造函数 2 父类构造函数的调用规则 如果子类没有定义构造函数
  • axios的三层封装思想

    1 工具函数层 设置默认请求地址 设置默认超时时间 设置默认请求拦截 设置默认响应拦截 ajax工具函数层 import axios from axios axios defaults baseURL http localhost 5000
  • vue2插件开发小试

    开发vue插件的官方文档是这样描述的 插件通常会为Vue添加全局功能 插件的范围没有限制 一般有下面几种 1 添加全局方法或者属性 如 vue element 2 添加全局资源 指令 过滤器 过渡等 如 vue touch 3 通过全局 m
  • KDD 2023

    下载地址 点我跳转 1 DoubleAdapt A Meta learning Approach to Incremental Learning for Stock Trend Forecasting Code None Area 一种用于
  • ubuntu 安装Pangolin 过程

    前言 大家好 好久没有写技术博客了 在工作学习中遇到一些问题及解决方法 希望能帮助到大家 Pangolin 想必大家都非常熟悉了 这个是一款开源的OPENGL显示库 可以用来视频显示 而且开发容易 代码我们可以从Github 进行下载 ht
  • JSP基础语法

    1 gt 2 gt hr
  • C++(13)——STl之List的实现

    STL STL是C 的标准模板库 是一个具有工业强度 高效的C 程序库 STL一个最为重要的特点就是数据结构和算法的分离 你可以使用其中的一些函数操作几乎热河的数据集合 包含链表 容器和数组 STL的另一个特性就是它不是面向对象的 STL主
  • 【环境配置】安装 Visual Studio 2022 Community 卡住了&& 安装 Windows SDK (Software Development Kits)卡住了

    问题原因 a 系统升级了 b 之前卸载没卸载干净 注册表里存在旧的信息 解决过程 1 查看日志 在资源管理器中输入 TEMP windowssdk 查看日志文件 找到最新的日志文件 在文件中搜索 Warning 出现了一组长串数字 用 括起
  • 基于Matlab小车倒立摆系统的控制(附上完整源码+数据)

    本文介绍了如何使用Matlab对小车倒立摆系统进行控制 倒立摆是一种经典的控制系统问题 通过控制小车的速度和方向 实现倒立摆的平衡 本文使用了模糊控制算法和PID控制算法来实现系统的控制 并通过Matlab进行仿真和实验验证 文章目录 1
  • Linux--编译链接(过程、原理、执行、多个文件)

    1 编译链接四个步骤 1 预编译 gcc E main c o main i 2 编译 gcc S main i o main s 3 汇编 gcc c main s o main o 4 链接 gcc main o o main 执行 m
  • 报错:RuntimeError: CUDA error: no kernel image is available for execution on the device

    报错 RuntimeError CUDA error no kernel image is available for execution on the device 提醒 安装pytorch时 除了要注意pytorch与torchvisi
  • vue 父子 子父 传值

    文档 Vue js 渐进式 JavaScript 框架 Vue js vuejs org 父给子传值 父组件
  • 【计算机基础】面试常问之进程、线程和协程

    文章目录 背景 为什么会有进程 线程和协程 1 进程的出现 2 线程的出现 3 协程的出现 1 进程 Process 1 1 什么是进程 程序与进程的区别 特点 1 2 进程通信及使用场景 无名管道 pipe 命名管道 FIFO 消息队列
  • 什么是区块链?为什么需要区块链?

    从个故事开始吧 第一章 信任 账本时代的故事 小王问你借100W 答应一年后还你200W 你心动了 可是又怕他不还 于是乎你找到了你们村长做鉴证人 你打了一个借条 上面写着 2018年 月小王借小胡100W 答应2019年 月还小胡200W
  • 服务器系统初始化时间长,企业级-Shell案例1——服务器系统配置初始化

    bin bash 安装系统性能分析工具及其他 yum install gcc make autoconf vim sysstat net tools iostat iftop iotp wget lrzsz lsof unzip opens
  • BUUCTF【Web】LoveSQL

    进入靶场后感觉这个SQL很熟悉 跟之前的第一关easySQL相似 但是这关显然要更难一点 还是用之前的方法 用1 试试发现有回显 所以这一关还是单引号闭合 首先使用万能用户名 密码随便输入 1 or 1 1 得到提示 此时发现他的用户名是a
  • Jetpack学习之Lifecycle

    Jetpack是Google为了解决Android架构问题而引入的 Google官方说的说法 Jetpack是一套库 工具和指南 可以帮助开发者更轻松地编写应用程序 Jetpack中的组件可以帮助开发者遵循最佳做法 摆脱编写样板代码的工作并