跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
BroadcastReceiver
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
# BroadcastReceiver '''BroadcastReceiver'''(广播接收器)是[[Android]]系统中的一种组件,用于监听和响应系统或应用发出的广播消息。它允许应用程序在特定事件发生时执行代码,而无需保持持续运行状态。 ## 概述 BroadcastReceiver是Android四大组件之一(其他三个是[[Activity]]、[[Service]]和[[ContentProvider]])。它工作在发布-订阅模式中,可以接收来自系统或其他应用的广播消息。 广播分为两种类型: * **普通广播(Normal broadcasts)** - 完全异步的广播,所有接收器几乎同时接收 * **有序广播(Ordered broadcasts)** - 同步执行的广播,一次只传递给一个接收器 ## 工作原理 <mermaid> graph LR A[广播发送者] -->|发送广播| B[Android系统] B -->|分发广播| C[BroadcastReceiver1] B -->|分发广播| D[BroadcastReceiver2] B -->|分发广播| E[...] </mermaid> ## 实现方式 ### 静态注册 在AndroidManifest.xml中声明接收器: <syntaxhighlight lang="xml"> <receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"/> </intent-filter> </receiver> </syntaxhighlight> ### 动态注册 在代码中动态注册接收器: <syntaxhighlight lang="java"> BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 处理广播 } }; IntentFilter filter = new IntentFilter("com.example.MY_ACTION"); registerReceiver(receiver, filter); </syntaxhighlight> ## 常见系统广播 Android系统会发送多种广播,常见的有: * `ACTION_BOOT_COMPLETED` - 系统启动完成 * `ACTION_BATTERY_LOW` - 电池电量低 * `ACTION_SCREEN_ON` - 屏幕点亮 * `ACTION_SCREEN_OFF` - 屏幕关闭 * `ACTION_AIRPLANE_MODE_CHANGED` - 飞行模式状态改变 ## 自定义广播 应用可以发送自定义广播: <syntaxhighlight lang="java"> Intent intent = new Intent(); intent.setAction("com.example.MY_ACTION"); intent.putExtra("data", "Hello World!"); sendBroadcast(intent); </syntaxhighlight> ## 权限控制 广播可以设置权限来限制发送和接收: <syntaxhighlight lang="xml"> <!-- 声明权限 --> <permission android:name="com.example.MY_PERMISSION"/> <!-- 发送带权限的广播 --> sendBroadcast(intent, "com.example.MY_PERMISSION"); <!-- 接收带权限的广播 --> <receiver android:name=".MyReceiver" android:permission="com.example.MY_PERMISSION"> <intent-filter> <action android:name="com.example.MY_ACTION"/> </intent-filter> </receiver> </syntaxhighlight> ## 最佳实践 1. **避免长时间操作**:`onReceive()`方法应在几秒内完成,否则可能导致ANR 2. **使用JobScheduler**:对于耗时任务,应使用[[JobScheduler]] 3. **及时注销**:动态注册的接收器应在不再需要时注销 4. **限制导出**:除非必要,应将`android:exported`设为false ## 实际应用示例 ### 监听网络状态变化 <syntaxhighlight lang="java"> public class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); if (isConnected) { Toast.makeText(context, "网络已连接", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(context, "网络已断开", Toast.LENGTH_SHORT).show(); } } } </syntaxhighlight> ## 限制与替代方案 从Android 8.0(API 26)开始,系统对广播接收器施加了更多限制: * 大多数静态注册的接收器无法接收隐式广播 * 建议使用[[JobScheduler]]或[[WorkManager]]替代部分广播功能 ## 参见 * [[Intent]] * [[Service]] * [[Android组件]] * [[Android权限系统]] [[Category:Android组件]] [[Category:Java编程]] [[Category:移动开发]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)