举个例子,假设我们有一个在屏幕上显示设备位置的 Activity。常见的实现可能如下所示:
虽然这个例子看起来没有太大的问题,但是在实际应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。比如多个组件会在生命周期方法(onStart() 和 onStop())中放置大量代码,不利于维护。
此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞态条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。
然后我们来看看怎么解决上面的问题?我们可以通过添加注解来监控组件的生命周期状态,您可以通过调用 Lifecycle 类的 addObserver()方法并传递观察者的实例来添加观察者,如以下示例中所示:
对于未知跟踪实例,我们可以让MyLocationListener 类实现 LifecycleObserver,然后在 onCreate 方法中实现 Activity 的 Lifecycle 对其进行初始化,然后配合注解。这意味着对生命周期状态的变化做出响应的逻辑会在MyLocationListener(而不是在 Activity)中进行声明。让各个组件存储自己的逻辑可使 Activity 和 Fragment 逻辑更易于管理。
对应到 MyLocationListener 的做法如下:
对于此实现,LocationListener 类可以完全感知生命周期。如果我们需要从另一个 Activity 或 Fragment 使用 LocationListener,只需对其进行初始化。所有设置和拆解操作都由类本身管理。
通常我们判断在应用是不是处于前后台的做法是:注册一个 registerActivityLifecycleCallbacks(callback),然后在 callback 中利用一个全局变量做计数,在onActivityStarted()中计数加1,在onActivityStopped方法中计数减1,从而判断前后台切换。
支持库 26.1.0 及更高版本中的 Fragment 和 Activity 已实现 LifecycleOwner接口。如果你有一个自定义类并希望使其成为 LifecycleOwner,可以使用 LifecycleRegistry类,但需要将事件转发到该类,代码如下:
该 MainActivty 是实现了 Activity 类,而不是 AppcompatActivity(FragmentActivity) 类,所以需要这样的处理。我们来看看 FragmentActivity 中的源码,比如 onCreate方法和 onPause方法
明白了基本的操作,我们再看看看源码是如何实现的,注意,本文不会仔细深究源码,而是梳理一个大概的思路,如果想要讲具体深入每个细节,则可以照着我这个思路深入研究。
首先我们来看 Lifecycle 这个类,让脑子里面有一个大致的概念
如果你觉得还不够清楚,只需要要记住五种状态对应六个生命周期方法(六个事件,ON_ANY 可以忽略)。然后我们再来看看官方的图,五个状态对应六个生命周期方法,六个事件,这句话一定要记住。
Event 表示生命周期事件,与 Activity/Fragment 生命周期方法对应。State 是 Lifecycle 这些生命周期对应的状态,为什么不直接用对应的生命周期设置对应的状态呢,而是设置了五个状态呢?原因很简单,因为 Lifecycle 不仅仅只是给自己用这些状态,还有 LiveData,ViewMode 等控件也会用到这些状态的进行逻辑判断,所以 Google 工程师做了更好的封装和管理。
Event 中的 ON_CREATE,ON_START,ON_RESUME 是在 LifecyclerOwner 对应的方法执行之后分发,ON_PAUSE,ON_STOP,ON_DESTROY 是在 LifecyclerOwner 对应的方法执行之前分发。
我们的 Activity 因为实现了 LifecycleOwner 才能直接调用 getLifecycle(),从前面的分析我们可以看到是在 ComponentActivity 中实现了该接口
getLifecycle().addObserver(MyObserver()) 是我们添加观察者的方式,我们来看看addObserver方法的实现,因为的实现是LifecycleRegistry
查看最后一行中的ReflectiveGenericLifecycleObserver
getInfo的内容如下:
接下来是重要方法createInfo,在该方法中进行注解的处理,并存储到 mCallbackMap。提供给后面的观察者调用
到这里观察者的注册和注解的处理,以及通知被观察者的流程就已经分析完毕了。
然后通过dispatch方法分发生命周期
dispatch 的具体逻辑如下,最终都是调用 handleLifecycleEvent来处理
因为我们这里是LifecycleRegistryOwner,所以来看看其handleLifecycleEvent方法
紧接着调用moveToState方法
接着调用sync方法,然后把生命周期同步给所有观察者
最终是调用了forwardPass方法,然后调用了ObserverWithState#dispatchEvent方法,然后调用onStateChanged方法,后面的流程就和上面一样了,整个流程就结束了。
整个流程还是比较简单的,如图所示
本文先从 Lifecycle 的使用,再到源码分析,分析了观察者和被观察者的注册和通知流程,也分析了生命周期的监听的使用方式,最后给出整体流程图。喜欢的点个赞吧~
Jetpack Compose是谷歌在2019Google i/o大会上发布的新的库,是用于构建原生Android UI的现代工具包。他有强大的工具和直观的Kotlin API,简化并加速了Android上的UI开发。可以帮助开发者用更少更直观的代码创建View,还有更强大的功能,以及还能提高开发速度。
客观地讲,Compose 确实是一套比较难学的东西,因为它毕竟太新也太大了,它是一个完整的、全新的框架,确实让很多人感觉「学不动」,这也是个事实。
如果你是因为缺少学习资料,而我正好薅到这本谷歌内部大佬根据实战编写的《Jetpack Compose最全上手指南》,从入门到精通,教程通俗易懂,实例丰富,既有基础知识,也有进阶技能,能够帮助读者快速入门,是你学习Jetpack Compose的葵花宝典,快收藏起来!!!
1. 为什么我们需要一个新的UI 工具?2. Jetpack Compose的着重点
3. API 设计
4. Compose API 的原则
5. 深入了解Compose
1. Android Jetpack Compose 最全上手指南
2. 深入详解 Jetpack Compose | 优化 UI 构建
3. 深入详解 Jetpack Compose | 实现原理
1. Jetpack Compose应用1
2. Jetpack Compose应用2
3. Jetpack Compose应用做一个倒计时器
4. 用Jetpack Compose写一个玩安卓App
5. 用Compose Android 写一个天气应用
6. 用Compose快速打造一个“电影App”
美观性、风格化和可控性是时下流行的 文成图 面临的三座大山,所谓美观性,指的是符合美学规则,不能有脸部畸变、 手指扭曲等瑕疵;所谓风格化,指的是能生成动漫、二次元等多种多样的风格;所谓可控性,指的是可以自由的控制生成图片中人物的性别、年龄、质态、种族、服装以及场景、光线等的能力. SDXL在图像生成的精细度、真实性、提示词忠实度和准确性上都有显著的提高,而且再也不需要冗长的咒语才能生成差强人意的图
在使用 DeepSeek 时,如何提问很大程度上决定了我们能得到怎样的回答。清晰、具体的问题,能让 DeepSeek 更好地理解我们的需求,从而给出更精准、更有价值的答。DeepSeek从入门到精通教程
1. Kubernetes介绍1.1 应用部署方式演变在部署应用程序的方式上,主要经历了三个时代:传统部署:互联网早期,会直接将应用程序部署在物理机上优点:简单,不需要其它技术的参与缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境优点:程序环境不会相互产生影响,提供了一定程度的安全性缺点
背景上篇介绍了 Android Jetpack 的基础组件 Lifecycle,它是生命周期感知型组件,实现生命周期管理的一致性,在内部
背景上一篇介绍了 Android Jetpack 组件 LiveData,LiveData是在Lifecycle 的帮助下,实现了生
# Android Jetpack从入门到精通Android Jetpack是Google推出的一套组件和工具库,旨在帮助开发者提高Android应用开发的效率和质量。Jetpack包含多个组件,如LiveData、ViewModel、Room等,帮助简化常见的开发任务。本文将介绍Jetpack的一些核心组件,并通过代码示例演示它们的用法。## 一、Jetpack组件概述Jetpack
# Jetpack架构组件从入门到精通## 介绍Jetpack是一个用于构建Android应用程序的一系列库、工具和指南的集合。它旨在帮助开发者更轻松、高效地构建应用程序,并提供了一些优秀的架构组件,以简化开发过程和提高应用程序的可维护性。本文将介绍Jetpack架构组件的基本概念和用法,并提供一些代码示例帮助读者更好地理解。## Jetpack架构组件Jetpack架构组件提供了
Jetpack 是 Google 推出的一些库的
在这篇博文里,我们要探讨“Android从入门到精通”的旅程。这个过程不单纯是学习一门技术,更是对整个生态系统的深入理解。从环境准备到优化技巧,我们将一步步带你了解如何成为一名精通的Android开发者。## 环境准备首先,我们需要进行环境的搭建,这里包括一些基本的软硬件要求。### 软硬件要求- **软件要求**: - Android Studio - Java Deve
前言:最近下载了AndroidStudio4.0,桌面图标变成了橘黄色,有点小清新,给人焕然一新的感觉,加载界面也变了,简直不要太时尚,在微信公众号和掘金看到几篇博客,写得不错,于是也尝试了一下.1.简介:Jetpack Compose是用于构建本机Android UI的现代工具包。Jetpack Compose使用更少的代码,强大的工具和直观的Kotlin API简化并加速了Android上的U
Android杂谈:Jetpack简介一、什么是Jetpack Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助开发者遵循最佳做法、让开发者摆脱编写样板代码的工作并简化复杂任务,以便开发者将精力集中放在所需的代码上。 Jetpack被Google推出的原因在于:规范开发者更快更好的开发出优质应用。二、Jetpack有什么(简单介绍) 那么Jetpack
前言Jetpack Compose 是用于构建原生界面的「新款 Android 工具包」。2021 Google IO 大会上,Google宣布:「Jetpack Compose 1.0 即将面世」。作为Android未来新的UI开发标准,Compose 会为 Android 开发带来哪些变化呢?本文将带来Jetpack Compose的特点及其跟传统Android UI开发方式的分析:基于Kot
Jetpack Room:从入门到精通概述一、为什么选择 Room?1.对比原生 SQLite2.对比greenDao
目录写在前面背景1系统前期配置1.1烧录1.2 配置环境变量1.3 使用vnc1.4 pip换源和安装1.5 pycharm安装2 pytorch环境搭建2.1 安装miniforge建立虚拟环境2.2 torch,torchvision的安装2.3 opencv的安装2.4 安装tensorrt2.5 安装torch2trt3 摄像头处理3.1csi摄像头3.2 usb摄像头写在前面jetpac
在本节中,你将建造一个应用程序来允许用户从一些不同的Views中进行选择。当用户选择一个View,一个新的活动将被启动。你将要使用给用户选择的工具就是Android菜单。看一下这个插图(略)。当用户激活菜单按钮,菜单就会显示。 如你所见,从Android主屏幕选择菜单按钮产生一个墙纸的设定选项。你将为你的主活动创建一个类似的菜单
1.介绍架构组件的目的是提供对应用程序体系结构的指导,并为诸如生命周期管理和数据持久化等常见任务提供开发库。架构组件帮你构造一个鲁棒、易测试、可维护和少模板代码的应用。架构组件是什么?为了介绍相关术语,这里有简短的介绍一下各架构组件以及它们之前如何协作。注意这个代码库包含一部分架构组件,它们是:LiveData、ViewModel和Room。每个组件会在使用的时候做解释。下图是基本的架构形式。En
/* Android开发入门经典实例 */ My notes/* 安卓开发入门 */涉及到了Android开发中的一些关键知识,比如:配置开发环境App中一个屏幕的抽象: Activity屏幕之间的跳转: Intent构成屏幕展示的视图组件:显示图片的 ImageView ,显示文字的 TextView ,把组件组成一个列表的 视图 ListView通过 Adapter 来控制模型和视图组件之间通
今年因为开学一个月之后才拿到签证被迫gap了,最近论文没啥好思路,再则又攒了点文章想着看看能不能申请个更好的项目所以搭个个人网站,本人之前纯算法开发可以说0经验,所以这个笔记也希望帮到更多的人?
随着开源文化的兴起,GitHub、Gitee 等代码托管平台成为程序员获取资源、学习技术、参与协作的重要阵地。项目的 Star 数量,成为衡量项目受欢迎程度和影响力的重要指标。许多开源项目维护者为了快速提升 Star 数,开始采取一些极端做法 "强制用户先给 Star,才能查看完整文档或体验演示"。 ...
第20场 (为了完整把前天的一部分粘贴过来了 T1 秒了 T2 我不行了,啥性质都分析出来了,就是没有想到把第 \(i\) 个物品合并放到第 \(i+1\) 里去,那我能说啥呢 见过的套路不够多加上当时的脑袋比较混沌,加上自己比较蠢没有想到可以这样子做,实际上我是想到了可以合并变成第 \(i+1\) ...
今天给大家带来一款非常实用的发票PDF文件识别软件——InvCom,它不仅能高效识别最新全电票和旧版电子发票,还能合并PDF文档,功能强大,操作便捷,是发票管理的得力助手。InvCom 发票PDF文件识别工具InvCom是一款绿色版软件,下载完成后,点击蓝色图标即可直接打开使用,无需复杂安装过程,方便快捷。软件的菜单栏功能丰富多样,每个功能都十分