android 四大组件和handler、looper

Android 四大组件

Android 开发中,四大组件(Four Major Components)是指构成 Android 应用程序的四种基本组件。这些组件是活动(Activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供者(Content Provider)。每个组件都有其特定的生命周期和用途,它们可以独立地或相互之间协作来构建复杂的应用程序。

1. 活动(Activity)

定义:Activity 是用户与手机屏幕交互的一个界面。它通常占据整个屏幕,并且用户可以在其中执行操作,如点击按钮、输入文本等。
用途:Activity 用于展示应用程序的用户界面。每个 Activity 通常都对应着一个屏幕,负责处理用户的输入事件并管理用户界面。
生命周期:Activity 有一个复杂的生命周期,包括创建(onCreate)、启动(onStart)、恢复(onResume)、暂停(onPause)、停止(onStop)和销毁(onDestroy)等状态。

2. 服务(Service)

定义:Service 是一个没有用户界面的组件,它在后台执行长时间运行的操作或者执行远程进程中的任务。
用途:Service 用于执行不需要用户交互的操作,如播放音乐、执行文件下载或与网络交互等。
生命周期:Service 的生命周期包括创建(onCreate)、启动(onStartCommand)、绑定(onBind)和销毁(onDestroy)。Service 可以是启动的(started)或绑定的(bound),这决定了它与其他组件的交互方式。

3. 广播接收器(Broadcast Receiver)

定义:Broadcast Receiver 是一个用于接收来自 Android 系统或应用程序的广播消息的组件。
用途:Broadcast Receiver 用于监听和响应系统范围内的广播事件,如屏幕关闭、电池电量低或自定义事件。
生命周期:Broadcast Receiver 没有可见的用户界面,它只在接收到广播时被激活,执行 onReceive() 方法,处理事件后即结束生命周期。

4. 内容提供者(Content Provider)

定义:Content Provider 是一个管理应用程序数据并提供给其他应用程序访问的组件。
用途:Content Provider 用于封装数据并提供一种在应用程序之间共享数据的机制,同时还可以保护数据的安全性。
生命周期:Content Provider 通常在应用程序启动时被创建,并在整个应用程序的生命周期内存在。它通过一组标准的 API(如 query、insert、update、delete)来管理数据的访问。

这四大组件是 Android 应用程序架构的基石,它们通过 Android 的清单文件(AndroidManifest.xml)声明,并在其中指定其属性和意图过滤器(Intent Filter)。可以通过意图(Intent)来启动或交互这些组件,从而实现不同组件之间的通信和协作。

Android handler

在 Android 开发中,Handler 是一个用于管理线程间通信的类,它允许你发送和处理 Message 和 Runnable 对象与一个消息队列(MessageQueue)关联的线程。Handler 主要用于在不同线程之间进行通信,尤其是在需要在主线程(UI线程)上更新用户界面或执行短操作时。

1、Handler 的主要用途:

在特定线程执行代码:可以将 Runnable 对象或 Message 对象发送到 Handler 所在的线程的消息队列中,这些对象将在该线程中按顺序处理。
延迟执行任务:可以安排 Runnable 或 Message 在将来的某个时间点执行。
周期性执行任务:可以周期性地发送消息或 Runnable 对象,以实现定时或重复执行的任务。

2、Handler 的工作原理:

当你创建一个 Handler 实例时,它会绑定到创建它的线程的 Looper。Looper 负责循环遍历消息队列,并将消息分发给 Handler 处理。
你可以通过调用 Handler 的 post(Runnable)、sendMessage(Message) 等方法来发送任务或消息。
Handler 通过重写 handleMessage(Message msg) 方法来处理消息。

3、Handler 的常见用法示例:

// 在主线程中创建 Handler
Handler handler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {// 处理从其他线程发送过来的消息if (msg.what == YOUR_MESSAGE_CODE) {// 更新UI或执行其他操作}}
};// 在子线程中发送消息到 Handler
new Thread(new Runnable() {@Overridepublic void run() {// 执行后台任务...// 现在需要更新UI,发送消息到 HandlerMessage message = Message.obtain(); // 获取消息对象message.what = YOUR_MESSAGE_CODE; // 设置消息代码handler.sendMessage(message); // 发送消息}
}).start();

在这个例子中,Handler 被用来在主线程中处理从子线程发送过来的消息。这是因为 Android 不允许在非主线程中直接更新UI。

注意事项:

避免内存泄漏:由于 Handler 可能会隐式持有对外部类的引用(例如,当它是一个匿名内部类时),如果不正确地管理,它可能会导致内存泄漏。使用静态内部类和弱引用可以减少这种风险。
从 Android API 28(Android 9 Pie)开始,推荐使用 Handler(Looper.getMainLooper()) 来创建与主线程关联的 Handler,而不是使用默认构造函数。
Handler 是 Android 中实现线程间通信的基本工具之一,它在许多异步操作和时间敏感的任务中都非常有用。

Android looper

在 Android 和其他基于事件驱动的系统中,Looper 是一个核心组件,用于管理线程中的消息队列。它工作在一个线程中,循环地从消息队列中取出消息并分发给相应的处理器(Handler)进行处理。Looper 使得线程能够以事件驱动的方式执行任务,而不是执行单一的、连续的处理。

1、Looper 的主要用途:

消息处理:Looper 能够从消息队列中按顺序取出消息,并将它们分发给 Handler 处理。这些消息可能代表了用户界面事件、网络响应、或者其他类型的异步事件。

任务调度:通过向 Looper 关联的消息队列发送消息,可以安排任务在将来的某个时间点执行。

线程间通信:Looper 使得不同线程之间可以通过消息传递进行通信,这是一种线程安全的通信方式。

事件循环:Looper 实现了事件循环机制,它可以使得线程在等待新的事件到来时保持空闲,而不是忙等(busy-waiting)。

2、Looper 的工作原理:

创建和准备:在线程中创建 Looper 对象,并调用 Looper.prepare() 方法来关联 Looper 与当前线程,并创建消息队列。

循环处理消息:调用 Looper.loop() 方法启动消息循环。这个循环会一直运行,直到 Looper 被停止。

发送消息:其他线程或同一线程的 Handler 实例可以向 Looper 的消息队列发送消息。

消息分发:Looper 从消息队列中取出消息,并将它们分发给对应的 Handler 处理。

退出循环:可以调用 Looper 的 quit() 或 quitSafely() 方法来安全地退出消息循环。

3、示例:

在 Android 应用程序中,主线程(也称为 UI 线程)自动有一个 Looper,用于处理 UI 事件。如果你需要在后台线程中创建一个 Looper,可以这样做:

class LooperThread extends Thread {public Handler mHandler;public void run() {Looper.prepare();mHandler = new Handler() {public void handleMessage(Message msg) {// 处理消息}};Looper.loop();}
}

在这个例子中,LooperThread 创建了自己的 Looper 和 Handler。Looper.prepare() 初始化 Looper,Looper.loop() 启动消息循环。Handler 负责处理发送到这个线程的消息。

注意事项:

每个线程只能有一个 Looper。
Looper 必须在它所属的线程中创建和循环。
在 Looper 的消息队列中处理消息时,应避免执行长时间运行的操作,以免阻塞 UI 或其他重要任务。
Looper 是 Android 消息传递和任务调度机制的基础,它在保持应用程序响应性和组织复杂的线程间通信方面起着关键作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/579833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git配置和钩子使用

0 Preface/Foreword 1 Usage 1.1 参考 https://www.cnblogs.com/guge-94/p/11287535.html 1.2 基本配置 1.2.1 配置名字和邮箱 git config --global user.name "xxx" git config --global user.email "xxx" 1.3 客户端基本配置 1.3.1 core.editor gi…

Hadoop-3.3.4集群部分lib缺失问题

1.问题描述 (base) [hadoophadoop1 native]$ hadoop checknative 2023-12-25 14:20:21,615 INFO bzip2.Bzip2Factory: Successfully loaded & initialized native-bzip2 library system-native 2023-12-25 14:20:21,618 INFO zlib.ZlibFactory: Successfully loaded &…

nodejs进阶

文章目录 写在前面一、dependencies、devDependencies和peerDependencies区别:二、需要牢记的npm命令2.1 npm init2.2 npm config list2.3 npm配置镜像源 三、npm install 的原理四、package-lock.json的作用五、npm run 的原理六、npx6.1 npx是什么6.2 npx的优势6.…

在Spring Boot中使用Redis

在Spring Boot中使用Redis,需要先添加Redis的依赖,然后配置Redis连接,最后通过Spring提供的模板类操作Redis。下面是一个基本的使用指南。1. 添加Redis依赖 在你的Spring Boot项目的pom.xml文件中,添加Redis Starter依赖: <dependency><groupId>org.springf…

深信服技术认证“SCSA-S”划重点:文件上传与解析漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…

百度站长、SEO、收录,网站自动提交百度链接 vuejs

created: 2023-12-26T10:34:37 (UTC +08:00) tags: [后端] source: https://juejin.cn/post/7152431823853715492 author: 源字节1号 Vue网站自动提交百度链接 - 掘金 Excerpt 怎样才能使新更新的文章更快的被百度收录,是所有站长最头疼的事情之一。开源字节使用自动提交脚本…

chrome扩展程序开发之在目标页面运行自己的JS

原文地址&#xff1a;https://qdgithub.com/home/index/article/aid/247.html chrome 插件开发的入门介绍&#xff0c;实现利用 chrome 扩展实现在目标网页运行我们的 js 的功能。关于 chrome 扩展的详细内容&#xff0c;可以通过官网了解。 开发工具很简单&#xff0c;记事本…

[spark] DataFrame 的 checkpoint

在 Apache Spark 中&#xff0c;DataFrame 的 checkpoint 方法用于强制执行一个物理计划并将结果缓存到分布式文件系统&#xff0c;以防止在计算过程中临时数据丢失。这对于长时间运行的计算过程或复杂的转换操作是有用的。 具体来说&#xff0c;checkpoint 方法执行以下操作&…

从AMI镜像恢复AWS Amazon Linux 2实例碰到的VNC服务以及Chrome浏览器无法启动的问题

文章目录 小结问题及解决VNC服务无法启动Chrome浏览器无法启动 参考 小结 将Amazon Linux 2保存为AMI (Amazon Machine Images)后&#xff0c;恢复成EC2 Instance (实例)后&#xff0c;VNC服务以及Chrome浏览器无法启动&#xff0c;进行了解决。 问题及解决 如果要将一个EC2…

treeview数据的保存和读取(以表格方式保存)

一个简单的treeivew&#xff0c;以表格方式保存比较简单&#xff0c;遍历所有节点&#xff0c;记录parentNode、node、data即可 parentiddataid002xx2001005xx5000003xx3001006xx6002007xx7001000xx0001001xx1-1004xx4007 如何将表格转为tree数据&#xff0c;代码如下&#xf…

数据结构-十大排序算法

数据结构十大排序算法 十大排序算法分别是直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序、外部排序。 其中插入排序包括直接插入排序、折半插入排序、希尔排序&#xff1b;交换排序包括冒泡排序、快速排序&#xff1…

LSTM中文新闻分类源码详解

LSTM中文新闻分类 一、导包二、读取数据三、数据预处理1.分词、去掉停用词和数字、字母转换成小写等2.新闻文本标签数值化 三、创建词汇表/词典1.data.Field()2.空格切分等3.构建词汇表/词典使用训练集构建单词表&#xff0c;vectorsNone:没有使用预训练好的词向量,而是使用的是…

阿里云自建官方Docker仓库镜像提交拉取方法

文章目录 发布镜像到DockerHub发布镜像到自建Docker仓库(Harbor)修改配置文件在Linux服务器中登录Docker打TAGPUSH提交镜像PULL拉取镜像 发布镜像到阿里云容器服务在Linux服务器中登录DockerPUSH提交镜像PULL拉取镜像 发布镜像到DockerHub 本地我们镜像命名可能会不规范&#…

详解Keras3.0 Layer API: LSTM layer

LSTM layer 用于实现长短时记忆网络&#xff0c;它的主要作用是对序列数据进行建模和预测。 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;根据当前输入和上一个时间步的隐藏状态&#xff0c;计算遗忘门的值。遗忘门的作用是控制哪些信息应该被遗忘&#xff0c;哪些…

kotlin by lazy 的使用

by lazy 的作用 by 是在kotlin中代表者委托&#xff0c; lazy 懒加载 by lazy 就是委托延时处理 下面写一个demo说明下 新建一个类 class ExportController {fun getName(): String? {return "name";}fun getAge(): Int {return 18;}} 在mian中如下 class Ma…

C语言中的结构体和联合体:异同及应用

文章目录 C语言中的结构体和联合体&#xff1a;异同及应用1. 结构体&#xff08;Struct&#xff09;的概述代码示例&#xff1a; 2. 联合体&#xff08;Union&#xff09;的概述代码示例&#xff1a; 3. 结构体与联合体的异同点相同点&#xff1a;不同点&#xff1a;代码说明 结…

C++面试宝典第10题:绘制各种图形

题目 我们需要编写一个图形相关的应用程序,并处理大量图形(Shape)信息,图形有矩形(Rectangle)、正方形(Square)、圆形(Circle)等种类。应用程序需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式作为示意)。 (1)请使用面…

华为——使用ACL限制内网主机访问外网网站示例

组网图形 图1 使用ACL限制内网主机访问外网网站示例 ACL简介配置注意事项组网需求配置思路操作步骤配置文件 ACL简介 访问控制列表ACL&#xff08;Access Control List&#xff09;是由一条或多条规则组成的集合。所谓规则&#xff0c;是指描述报文匹配条件的判断语句&#…

Python技能手册 - 模块module

目录 内置排序 列表排序 元组排序 字符串排序&#xff08;按长度&#xff09; 字符串排序&#xff08;按字典序&#xff09; 类排序 Lambda表达式排序 copy 浅拷贝 copy.copy 深拷贝 copy.deepcopy heapq 创建&#xff08;小顶&#xff09;堆 heapq.heappush 获取…

Spring系列:基于Spring-Jdbc实现事务

文章目录 一、事务基本概念二、编程式事务三、声明式事务前期准备 四、基于注解的声明式事务Transactional注解标识的位置事务属性&#xff1a;只读事务属性&#xff1a;超时事务属性&#xff1a;回滚策略事务属性&#xff1a;隔离级别事务属性&#xff1a;传播行为测试 五、基…