元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
系统架构
Android系统架构概述
Linux内核定制
硬件抽象层(HAL)
▶
进程管理
进程生命周期
进程间通信机制
进程调度策略
▶
四大组件
Activity原理与生命周期
Service工作原理
BroadcastReceiver机制
ContentProvider数据共享
▶
Binder机制
Binder驱动原理
AIDL接口实现
Binder通信优化
▶
内存管理
内存分配机制
垃圾回收策略
内存泄漏分析
▶
启动流程
Bootloader阶段
Init进程解析
Zygote启动流程
▶
虚拟机
JIT与AOT编译
类加载机制
▶
事件处理
输入事件分发
触摸事件处理
传感器事件管理
▶
电源管理
省电模式原理
WakeLock机制
电源状态监控
▶
安全机制
权限管理模型
SELinux策略
应用沙箱机制
▶
性能优化
启动速度优化
内存优化技巧
▶
HAL层
HAL接口设计
硬件驱动交互
HAL模块开发
▶
资源管理
资源加载机制
多语言适配
动态资源加载
▶
热修复
热修复原理
▶
多线程
Handler机制
AsyncTask原理
线程池管理
▶
渲染机制
SurfaceFlinger原理
VSync同步机制
UI绘制流程
▶
系统更新
OTA升级原理
A/B分区更新
系统补丁机制
▶
应用安装流程
APK解析过程
安装器工作原理
动态加载机制
发布时间:
2025-03-22 13:11
↑
☰
# BroadcastReceiver机制 本文将详细介绍Android系统中的广播机制,帮助读者理解BroadcastReceiver的工作原理和使用方法。 ## 广播机制概述 ### 1. 定义与作用 BroadcastReceiver是Android四大组件之一,主要用于: - 接收系统或应用发出的广播消息 - 实现应用间的消息通信 - 监听系统状态变化 - 触发后台任务 ### 2. 基本特性 - 无用户界面 - 可动态注册和注销 - 支持有序和无序广播 - 可以跨进程通信 ## 广播类型 ### 1. 普通广播 ```java // 发送普通广播 public void sendNormalBroadcast() { Intent intent = new Intent("com.example.NORMAL_ACTION"); intent.putExtra("data", "normal broadcast"); sendBroadcast(intent); } // 接收普通广播 public class NormalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = intent.getStringExtra("data"); // 处理广播数据 } } ``` ### 2. 有序广播 ```java // 发送有序广播 public void sendOrderedBroadcast() { Intent intent = new Intent("com.example.ORDERED_ACTION"); intent.putExtra("data", "initial data"); sendOrderedBroadcast(intent, null, new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 最终接收者处理 } }, null, Activity.RESULT_OK, null, null); } // 接收有序广播 public class OrderedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String data = getResultData(); // 修改数据 setResultData("modified data"); // 终止广播 // abortBroadcast(); } } ``` ### 3. 粘性广播(已废弃) ```java // 发送粘性广播(不推荐使用) public void sendStickyBroadcast() { Intent intent = new Intent("com.example.STICKY_ACTION"); intent.putExtra("data", "sticky broadcast"); sendStickyBroadcast(intent); } ``` ### 4. 本地广播 ```java // 使用LocalBroadcastManager public class LocalBroadcastExample { private LocalBroadcastManager localBroadcastManager; private BroadcastReceiver receiver; public void setup() { localBroadcastManager = LocalBroadcastManager.getInstance(context); receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 处理本地广播 } }; // 注册本地广播接收器 localBroadcastManager.registerReceiver(receiver, new IntentFilter("LOCAL_ACTION")); } public void sendLocalBroadcast() { Intent intent = new Intent("LOCAL_ACTION"); localBroadcastManager.sendBroadcast(intent); } public void cleanup() { localBroadcastManager.unregisterReceiver(receiver); } } ``` ## 注册方式 ### 1. 静态注册 ```xml <!-- AndroidManifest.xml --> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="com.example.MY_ACTION" /> </intent-filter> </receiver> ``` ### 2. 动态注册 ```java public class DynamicRegistrationExample extends Activity { private BroadcastReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 处理广播 } }; // 注册广播接收器 IntentFilter filter = new IntentFilter(); filter.addAction("com.example.MY_ACTION"); registerReceiver(receiver, filter); } @Override protected void onDestroy() { super.onDestroy(); // 注销广播接收器 unregisterReceiver(receiver); } } ``` ## 广播权限 ### 1. 发送广播权限 ```java // 发送带权限的广播 public void sendProtectedBroadcast() { Intent intent = new Intent("com.example.PROTECTED_ACTION"); sendBroadcast(intent, "com.example.CUSTOM_PERMISSION"); } ``` ### 2. 接收广播权限 ```xml <!-- 声明权限 --> <permission android:name="com.example.CUSTOM_PERMISSION" android:protectionLevel="signature" /> <!-- 使用权限 --> <uses-permission android:name="com.example.CUSTOM_PERMISSION" /> <!-- 接收器声明 --> <receiver android:name=".ProtectedReceiver" android:permission="com.example.CUSTOM_PERMISSION"> <intent-filter> <action android:name="com.example.PROTECTED_ACTION" /> </intent-filter> </receiver> ``` ## 实现原理 ### 1. 广播分发机制 ```java // 广播分发流程示意 public class BroadcastQueue { private final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<>(); private final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<>(); public void enqueueBroadcastLocked(Intent intent, ProcessRecord callerApp, String callerPackage, int callingUid, boolean ordered) { BroadcastRecord r = new BroadcastRecord(intent, callerApp, callerPackage, callingUid, ordered ? mOrderedBroadcasts : mParallelBroadcasts); if (ordered) { mOrderedBroadcasts.add(r); } else { mParallelBroadcasts.add(r); } scheduleBroadcastsLocked(); } } ``` ### 2. 接收器调用 ```java // 接收器调用流程 public final class ReceiverDispatcher { private final BroadcastReceiver mReceiver; private final Context mContext; private final Handler mActivityThread; private final Instrumentation mInstrumentation; private final boolean mRegistered; public void performReceive(Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky, int sendingUser) { // 准备接收环境 Args args = new Args(intent, resultCode, data, extras, ordered, sticky, sendingUser); if (intent == null) { return; } // 调用接收器的onReceive方法 mActivityThread.post(() -> { try { mReceiver.onReceive(mContext, intent); } catch (Exception e) { // 处理异常 } }); } } ``` ## 最佳实践 ### 1. 广播使用建议 1. 选择合适的广播类型 - 一般场景用普通广播 - 需要顺序处理用有序广播 - 应用内通信用本地广播 2. 注册方式选择 - 需要常驻后台用静态注册 - 和组件生命周期同步用动态注册 - 注意及时注销避免内存泄漏 3. 安全性考虑 - 使用权限控制 - 避免敏感信息 - 验证广播来源 ### 2. 性能优化 1. 避免耗时操作 - onReceive方法中不做耗时工作 - 使用Service处理后台任务 - 合理使用WakeLock 2. 减少广播次数 - 合并相似广播 - 使用其他通信方式 - 避免频繁发送 ### 3. 调试技巧 ```java // 广播调试辅助类 public class BroadcastDebugHelper { public static void logBroadcast(Context context, Intent intent, String tag) { // 记录广播信息 Log.d(tag, "Action: " + intent.getAction()); Log.d(tag, "Package: " + context.getPackageName()); Log.d(tag, "Time: " + System.currentTimeMillis()); // 打印Extra数据 Bundle extras = intent.getExtras(); if (extras != null) { for (String key : extras.keySet()) { Log.d(tag, "Extra: " + key + " = " + extras.get(key)); } } } } ``` ## 总结 BroadcastReceiver机制的关键点: 1. 多种广播类型 - 普通广播 - 有序广播 - 本地广播 2. 灵活的注册方式 - 静态注册 - 动态注册 - 权限控制 3. 系统级通信 - 跨进程通信 - 系统事件监听 - 应用间交互 通过合理使用广播机制,开发者可以: 1. 实现组件间通信 2. 监听系统状态 3. 触发后台任务 4. 实现应用解耦