Broadcast Receiver 是 Android 的一个组件,用于监听和处理系统广播消息,例如网络状态变化、电池电量、接收 SMS 或安装应用程序。它在事件发生时由操作系统启动,并在主线程或通过后台服务执行任务。根据 Android Developer Guide, 2026,Broadcast Receiver 允许应用程序响应全局系统事件,即使它没有运行,这使其成为 Android 生态系统中后台事件处理的关键机制。
要点
Broadcast Receiver 是 Android 的一个组件,用于接收和处理由操作系统或其他应用程序传播的 Intent 消息。与 Activity 和 Service 不同,Broadcast Receiver 没有用户界面 — 它的任务是在事件发生时执行一个简短的任务。
Broadcast Receiver 通过 Intent 机制工作。系统或应用程序通过 sendBroadcast 或 sendOrderedBroadcast 发送 Intent,操作系统将其传递给已注册的接收器。每个接收器在 onReceive 方法中接收 Intent,该方法在主线程中执行。
根据 Android Compatibility Definition Document,Broadcast Receiver 必须在 10 秒内完成 onReceive — 否则系统认为它已冻结并终止进程。对于长时间的后台任务,请使用从接收器启动的 JobScheduler 或 WorkManager。
Android 支持两种主要广播类型:Normal Broadcast 和 Ordered Broadcast。区别在于传递顺序和中断处理链的可能性。此外,广播分为系统广播(由操作系统生成)和用户广播(由应用程序创建)。
Normal Broadcast 异步传递给所有已注册的接收器,且不保证顺序。系统可以并行处理此类广播 — 每个接收器在自己的线程中接收 Intent。在 Normal Broadcast 中调用 abortBroadcast 无效:无法取消传递给其他接收器。
Ordered Broadcast 按顺序传递 — 每个接收器按照 android:priority 属性(从 0 到 999)的降序排列。处理之后,接收器可以通过 setResultExtras 将结果传递给下一个,或通过调用 abortBroadcast 中断链。这用于处理顺序重要的场景 — 例如 SMS 接收器。
Android 生成许多 系统广播:ACTION_BOOT_COMPLETED(设备启动)、ACTION_BATTERY_LOW、ACTION_POWER_CONNECTED、CONNECTIVITY_ACTION、ACTION_PACKAGE_ADDED 等。每个 Intent 在 Extras 中包含附加数据 — 电池电量、连接类型、包名。
| 广播类型 | 顺序 | abortBroadcast | 性能 |
|---|---|---|---|
| Normal | 不保证 | 不起作用 | 高(并行) |
| Ordered | 按优先级 | 起作用 | 中(顺序) |
| Sticky | 单个值 | 不适用 | 低(自 API 21 起已弃用) |
Sticky Broadcast — 一种已弃用的类型,用于保存最后发送的值。请改用 LiveData、StateFlow 或共享的 SharedPreferences 来存储最新状态。
Broadcast Receiver 可以通过两种方式注册:通过 AndroidManifest.xml 静态注册,或在代码中通过 registerReceiver 动态注册。选择取决于场景:静态注册即使应用程序没有运行也能工作,动态注册仅在注册组件活跃时工作。
静态注册在清单中使用 <receiver> 标签在 <application> 内声明。对于每个接收器,指定处理程序类和它应该拦截的 Intent 过滤器。系统在广播发生时加载此类接收器,即使应用程序没有运行。
<!-- Static Broadcast Receiver registration in manifest -->
<receiver android:name=".BootReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
动态注册通过 registerReceiver 方法在 Activity、Service 或 Fragment 的代码中执行。接收器仅在注册它的组件存活期间存活。必须在 onPause 或 onDestroy 中调用 unregisterReceiver — 否则会导致内存泄漏,系统可能会终止进程。
对于 Ordered Broadcast,传递顺序由 android:priority 属性决定。优先级较高的接收器较早接收 Intent。如果处理之后它调用了 abortBroadcast,优先级较低的接收器将不会收到 Intent。对于静态接收器,优先级在清单的 Intent 过滤器中设置。
Ordered Broadcast 中的接收器可以通过 setResultExtras 或 setResultData 将数据传输给链中的下一个。这允许流水线处理:第一个接收器用附加数据丰富 Intent,第二个使用它们,第三个完成链。getResultExtras 方法读取前一个接收器传输的数据。
对于 Normal Broadcast,顺序不保证,因此所有接收器都接收原始的 Intent 而不做更改。如果您需要接收器相互影响,请使用 sendOrderedBroadcast 而不是 sendBroadcast。
Android 8(API 26,Oreo)引入了关于后台广播的重大 限制。大多数隐式广播 — 那些不针对特定应用程序的广播 — 不再与静态注册一起使用。系统阻止清单中注册的接收器处理诸如 CONNECTIVITY_ACTION 或 ACTION_BATTERY_LOW 之类的操作。
Google 确定了继续使用静态注册的广播列表:BOOT_COMPLETED、TIME_TICK、Alarm、INSTANCE?(包更改) — 总共大约十个例外。所有其他隐式广播现在需要通过 Context.registerReceiver 进行动态注册,这仅在应用程序在前台时有效。
对于以前通过 Broadcast Receiver 解决的后台任务,Android 推荐 WorkManager(具有执行保证的延迟任务)、JobScheduler(考虑设备状态的定期任务)和 NotificationListenerService(通知监控)。这些组件在没有 Android 8 限制的情况下工作,并针对功耗进行了优化。
让我们考虑创建一个用于跟踪网络连接的 Broadcast Receiver。接收器将接收 CONNECTIVITY_ACTION 广播并记录连接类型。对于 Android 8+,我们将动态注册它,因为这是一个被排除在静态注册之外的隐式广播。
// 用于网络状态跟踪的 Broadcast Receiver
class NetworkReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val network = cm.activeNetwork
val caps = cm.getNetworkCapabilities(network)
val connectionType = when {
caps?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true -> "WiFi"
caps?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true -> "Cellular"
else -> "Disconnected"
}
Log.d("NetworkReceiver", "连接类型:$connectionType")
}
}
// 在 Activity 中动态注册
class MainActivity : AppCompatActivity() {
private val networkReceiver = NetworkReceiver()
override fun onStart() {
super.onStart()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)
registerReceiver(networkReceiver, filter)
}
override fun onStop() {
super.onStop()
unregisterReceiver(networkReceiver)
}
}
务必在 onStop 中取消注册接收器 — 如果 Activity 进入后台但接收器保持注册状态,系统将无法释放资源。对于 Service,使用 onDestroy。在 Fragment 中,在 onStart 中注册接收器并在 onStop 中取消注册,遵循 Fragment 的生命周期。
常见问题
Broadcast Receiver 是用于处理系统和用户广播消息的 Android 组件。它在 onReceive 方法中接收 Intent,该方法在主线程中执行,并且必须在 10 秒内完成。对于长时间的任务,请使用 WorkManager 或 JobScheduler。
Normal Broadcast 异步并行传递给所有接收器 — 顺序不保证,abortBroadcast 不起作用。Ordered Broadcast 按优先级顺序传递,每个接收器可以中断链或通过 setResultExtras 传输数据。
静态注册(在清单中)允许接收器即使在应用程序没有运行时也能工作。动态注册(通过 registerReceiver)仅在注册组件活跃时工作。从 Android 8 开始,许多隐式广播需要动态注册。
Android 8(API 26)禁止了对大多数隐式广播的 静态注册,例如 CONNECTIVITY_ACTION 或 ACTION_BATTERY_LOW。例外包括 BOOT_COMPLETED、Alarm、时间和其他一些。对于后台任务,请使用 WorkManager 而不是广播。
使用 LiveData、StateFlow、EventBus 或 LocalBroadcastManager 将数据从 onReceive 传输到 UI。不要尝试直接从 onReceive 更新 UI — 它在主线程中执行,但接收器不保证 Activity 可见。LocalBroadcastManager 是用于内部通信的已弃用选项。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。