Android开发中广播(Broadcast)技术详解
在 Android 开发中,广播(Broadcast) 是一种广泛使用的组件通信机制,它允许应用程序在不直接交互的情况下传递消息。本文将详细讲解 Android 广播的基本概念、类型、发送与接收流程、使用场景及注意事项,并结合具体的代码示例,帮助你全面掌握这一技术。
- 广播的基本概念
广播 是一种跨应用的消息传递机制,任何应用都可以发送广播,其他应用只要拥有相应权限即可接收。广播的本质是通过 Intent 对象携带消息,在系统或应用间分发。
广播的类型
普通广播(Normal Broadcast):异步发送,所有接收者几乎同时收到消息。
有序广播(Ordered Broadcast):同步发送,接收者按优先级顺序处理,可中断。
粘性广播(Sticky Broadcast):已废弃,不推荐使用。
本地广播(Local Broadcast):仅在应用内部传递,效率更高且更安全。
广播的生命周期
广播接收者(BroadcastReceiver)在接收到广播时执行 onReceive 方法,处理完成后即销毁。因此,onReceive 不应执行耗时操作。
- 广播的发送与接收
2.1 发送广播
发送广播通过 sendBroadcast 方法实现,需要指定一个 Intent 对象。
Intent intent = new Intent(“com.example.MY_ACTION”);
intent.putExtra(“key”, “value”);
sendBroadcast(intent);
2.2 接收广播
接收广播需要注册 BroadcastReceiver,注册方式分为静态和动态两种。
静态注册
在 AndroidManifest.xml 中声明,适用于系统级广播,即使应用未运行也能接收。
动态注册
在代码中注册,通常在 Activity 或 Service 中,应用运行时有效。
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter(“com.example.MY_ACTION”);
registerReceiver(receiver, filter);
注销:动态注册的接收者需在适当时候注销,例如在 onDestroy 中:
unregisterReceiver(receiver);
BroadcastReceiver 实现
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String value = intent.getStringExtra(“key”);
// 处理接收到的数据
}
}
- 广播类型详解
3.1 普通广播
特点:异步,所有接收者几乎同时接收。
使用场景:通知多个组件同时执行操作,如更新 UI。
示例:
Intent intent = new Intent(“com.example.UPDATE_UI”);
sendBroadcast(intent);
3.2 有序广播
特点:同步,接收者按优先级顺序接收,可通过 abortBroadcast() 中断。
优先级:通过 android:priority 设置,值越大优先级越高。
示例:
Intent intent = new Intent(“com.example.ORDERED_ACTION”);
sendOrderedBroadcast(intent, null);
AndroidManifest.xml 设置优先级:
中断广播:
public class HighPriorityReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 处理逻辑
abortBroadcast(); // 中断广播
}
}
3.3 本地广播
特点:使用 LocalBroadcastManager,仅在应用内部传递。
优势:效率高,防止广播泄露。
示例:
// 发送本地广播
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
// 注册接收者
LocalBroadcastManager.getInstance(this).registerReceiver(receiver, filter);
// 注销接收者
LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
- 广播的使用场景
4.1 系统广播
Android 系统会发送多种广播,如电量变化、网络状态变化等。
示例:监听电量变化。
public class BatteryReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra(“level”, 0);
// 处理电量变化
}
}
4.2 自定义广播
用于应用内组件通信。
示例:Service 发送广播通知 Activity 更新数据。
// 在 Service 中
Intent intent = new Intent(“com.example.DATA_UPDATED”);
sendBroadcast(intent);
// 在 Activity 中
public class MyActivity extends AppCompatActivity {
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 更新 UI
}
};
@Override
protected void onResume() {super.onResume();IntentFilter filter = new IntentFilter("com.example.DATA_UPDATED");registerReceiver(receiver, filter);
}@Override
protected void onPause() {super.onPause();unregisterReceiver(receiver);
}
}
4.3 权限控制
通过权限限制广播的发送和接收。
发送时指定权限:
sendBroadcast(intent, “com.example.PERMISSION”);
接收时声明权限:
- 注意事项
性能:onReceive 在主线程执行,避免耗时操作。
安全性:避免泄露敏感信息,推荐本地广播或权限控制。
生命周期:动态注册的接收者需及时注销,防止内存泄漏。
Android 8.0+ 限制:静态注册对部分系统广播无效,建议动态注册或使用 JobScheduler。
-
完整代码示例
以下是一个完整的示例,展示 Service 发送广播,Activity 动态接收并更新 UI。
Service 发送广播:
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(() -> {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Intent broadcastIntent = new Intent(“com.example.DATA_UPDATED”);
broadcastIntent.putExtra(“data”, “Hello from Service”);
sendBroadcast(broadcastIntent);
}).start();
return super.onStartCommand(intent, flags, startId);
}@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Activity 接收广播:
public class MainActivity extends AppCompatActivity {
private TextView textView;
private BroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String data = intent.getStringExtra("data");textView.setText(data);}};IntentFilter filter = new IntentFilter("com.example.DATA_UPDATED");registerReceiver(receiver, filter);startService(new Intent(this, MyService.class));
}@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(receiver);
}
}
- 总结
Android 广播是组件通信的重要工具,适用于系统事件监听、应用间通信等多种场景。
相关文章:
Android开发中广播(Broadcast)技术详解
在 Android 开发中,广播(Broadcast) 是一种广泛使用的组件通信机制,它允许应用程序在不直接交互的情况下传递消息。本文将详细讲解 Android 广播的基本概念、类型、发送与接收流程、使用场景及注意事项,并结合具体的代…...
MySQL视图高级应用与最佳实践
1. 视图与索引的协同优化 物化视图(模拟实现) MySQL原生不支持物化视图,但可通过“定时刷新”的物理表模拟: -- 1. 创建存储结果的物理表 CREATE TABLE cached_monthly_sales (product_id INT,total_sales DECIMAL(10…...
xss4之cookie操作
一、登录网站情况分析 1. 登录状态与Cookie的关系 已登录状态: 当用户登录网站后,如admin123456,网站会通过某种方式(如Cookie)在客户端保存用户的登录状态。Cookie的作用: Cookie是服务器发送到用户浏览器并保存在本地的一小块…...
51c大模型~合集119
我自己的原文哦~ https://blog.51cto.com/whaosoft/13852062 #264页智能体综述 MetaGPT等20家顶尖机构、47位学者参与 近期,大模型智能体(Agent)的相关话题爆火 —— 不论是 Anthropic 抢先 MCP 范式的快速普及,还是 OpenAI …...
Vue3 + TypeScript,关于item[key]的报错处理方法
处理方法1:// ts-ignore 注释忽略报错 处理方法2:item 设置为 any 类型...
【记录】服务器用命令开启端口号
这里记录下如何在服务器上开启适用于外界访问的端口号。 方法 1 使用防火墙 1 su ,命令 输入密码 切换到root节点 2 开启防火墙 systemctl start firewalld3 配置开放端口 firewall-cmd --zonepublic --add-port8282/tcp --permanent4 重启防火墙 firewall-cmd…...
如何优雅地实现全局唯一?深入理解单例模式
如何优雅地实现全局唯一?深入理解单例模式 一、什么是单例模式? 单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并为该实例提供全局访问点,从而避免全局变量的命名污染,并支持延迟初始化Wiki…...
25.4.20学习总结
如何使用listView组件来做聊天界面 1. 什么是CellFactory? 在JavaFX中,控件(比如ListView、TableView等)用Cell来显示每一条数据。 Cell:代表这个单元格(即每个列表项)中显示的内容和样式。 …...
Spring之我见 - Spring Boot Starter 自动装配原理
欢迎光临小站:致橡树 Spring Boot Starter 的核心设计理念是 约定优于配置,其核心实现基于 自动配置(Auto-Configuration) 和 条件化注册(Conditional Registration)。以下是其生效原理: 约定…...
如何高效利用呼叫中心系统和AI语音机器人
要更好地使用呼叫中心系统和语音机器人,需要结合两者的优势,实现自动化、智能化、高效率的客户服务与业务运营。以下是优化策略和具体实践方法: 一、呼叫中心系统优化 1. 智能路由与IVR优化 智能ACD(自动呼叫分配) …...
【Windows上配置Git环境】
在Windows上配置Git环境可以按照以下步骤进行: 1. 下载Git 打开浏览器,访问Git官方网站https://git-scm.com/downloads。在下载页面中,找到适用于Windows的下载链接,根据你的系统是32位还是64位选择相应的安装包进行下载 。 2.…...
OpenCV基础01-图像文件的读取与保存
介绍: OpenCV是 Open Souce C omputer V sion Library的简称。要使用OpenCV需要安装OpenCV包,使用前需要导入OpenCV模块 安装 命令 pip install opencv-python 导入 模块 import cv2 1. 图像的读取 import cv2 img cv2.imread(path, flag)这里的flag 是可选参数&…...
C 语言的未来:在变革中坚守与前行
C 语言,作为编程语言领域的一位 “老将”,自诞生以来就一直扮演着至关重要的角色。历经数十年的发展,它的影响力依然广泛而深远。在科技飞速发展的今天,新的编程语言如雨后春笋般不断涌现,C 语言的未来发展走向成为了众…...
go语言优雅关机和优雅重启笔记
一、优雅关机 生活化例子 餐馆关门:你去餐馆吃火锅,刚坐下点完菜(客户端发请求),餐馆老板突然接到通知要停电(收到关机指令)。老板很贴心,先停止接待新客人(停止接收新请…...
【算法】计数排序、桶排序、基数排序
算法系列八:非比较排序 一、计数排序 1.实现 1.1步骤 1.2代码 2.性质 2.1稳定性 2.1.1从前往后前始版: 2.1.2从后往前末始版: 2.2复杂度 2.2.1时间复杂度 2.2.2空间复杂度 二、桶排序 1.实现 1.1步骤 1.2代码 2.稳定性 三、…...
Halcon应用:相机标定
提示:若没有查找的算子,可以评论区留言,会尽快更新 Halcon应用:相机标定 前言一、Halcon应用?二、应用实战1、图像理解1.1、开始标定 前言 本篇博文主要用于记录学习Halcon中算子的应用场景,及其使用代码和…...
【C++ 程序设计】实战:C++ 实践练习题(31~40)
目录 31. 数列:s 1 + 2 + 3 + … + n 32. 数列:s 1 - 2 - 3 - … - n 33. 数列:s 1 + 2 - 3 + … - n 34. 数列:s 1 - 2 + 3 - … &#…...
【perf】perf工具的使用生成火焰图
文章目录 1. What is perf?2. perf使用2.1 perf的子工具集2.2 常用指令perf list指令格式参数perf中事件分类使用示例 perf stat指令格式参数 perf top指令格式参数交互式界面操作使用示例 perf record指令格式参数使用示例 perf report指令格式参数交互式界面操作使用示例 pe…...
绿幕抠图直播软件-蓝松抠图插件--使用相机直播,灯光需要怎么打?
使用SONY相机进行绿幕抠图直播时,灯光布置是关键,直接影响抠图效果和直播画质。以下是详细的灯光方案和注意事项: 一、绿幕灯光布置核心原则 均匀照明:绿幕表面光线需均匀,避免阴影和反光(亮度差控制在0.5…...
从外网访问局域网服务器的方法
一、为什么局域网的服务器无法在外网访问? 服务器、电脑之间靠IP地址寻址,目前大部分基于IPV4进行寻址访问。但是因为IPV4的地址数量有限,中国分到的还比较少,所以非常紧缺。 一个解决方案就是在局域网来建立一个内部的网…...
每日面试实录·携程·社招·JAVA
📍面试公司:携程 👜面试岗位:后端开发工程师(社招) 🕐面试时长:约 50 分钟 🔄面试轮次:第 1 轮技术面 ✨面试整体节奏: 这场携程的社招 Java 一面…...
Redis增删改查
### 进入redis控制台 redis-cli --raw #加上raw,防止中文乱码### 增 127.0.0.1:6379> LPUSH list0 "hello" #增加一个list 1 127.0.0.1:6379> LRANGE list0 0 -1 #查看list hello### 删 127.0.0.1:6379> DEL list0 #删除list 1 127.0.0.1:6379> LRANG…...
机器学习 Day12 集成学习简单介绍
1.集成学习概述 1.1. 什么是集成学习 集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它类似于: 超级个体 vs 弱者联盟 单个复杂模型(如9次多项式函数)可能能力过强但容易过拟合 组合多个简单模型(如一堆1次函数)可以增强能力而不易过拟合 集成…...
学习笔记十九——Rust多态
🧩 Rust 多态终极通俗指南 📚 目录导航 多态一句话概念静态分派 vs 动态分派——根本差异参数化多态(泛型) 3.1 函数里的泛型 3.2 结构体里的泛型 3.3 方法里的泛型 3.4 枚举里的泛型Ad hoc 多态(特例多态࿰…...
交换机与路由器的主要区别:深入分析其工作原理与应用场景
在现代网络架构中,交换机和路由器是两种至关重要的设备。它们在网络中扮演着不同的角色,但很多人对它们的工作原理和功能特性并不十分清楚。本文将深入分析交换机与路由器的主要区别,并探讨它们的工作原理和应用场景。 一、基本定义 1. 交换…...
【Oracle专栏】Oracle中的虚拟列
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 在EXP方式导出时,发现 出现如下提示 EXP-00107: virtual column 不支持,因此采用expdp方式导出。于是本文针对oracle虚拟列进行简单介绍。 2. 相…...
2020 年 7 月大学英语四级考试真题(组合卷)——解析版
🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,目前中南大学MBA在读,也考取过HCIE Cloud Computing、CCIE Security、PMP、CISP、RHCE、CCNP RS、PEST 3等证书。🐳 &…...
大语言模型的训练、微调及压缩技术
The rock can talk — not interesting. The rock can read — that’s interesting. (石头能说话,不稀奇。稀奇的是石头能读懂。) ----硅谷知名创业孵化器 YC 的总裁 Gar Tan 目录 1. 什么是大语言模型? 2. 语言建模ÿ…...
NEAT 算法解决 Lunar Lander 问题:从理论到实践
NEAT 算法解决 Lunar Lander 问题:从理论到实践 0. 前言1. 定义环境2. 配置 NEAT3. 解决 Lunar lander 问题小结系列链接0. 前言 在使用 NEAT 解决强化学习问题一节所用的方法只适用于较简单的强化学习 (reinforcement learning, RL) 环境。在更复杂的环境中使用同样的进化解…...
firewall指令
大家好,今天我们继续来了解服务管理,来看看打开或关闭指定端口,那么话不多说,开始吧. 1.打开或者关闭指定端口 在真正的生产环境,往往需要防火墙,但问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器监听通讯,这时,需要打开指定的端口,比如80,22,8080等. 2.fi…...
