Broadcast Receiver:是什么、Broadcast 类型及工作原理

作者: IT Sectr 发布日期: 2026-06-17 阅读时间: 7 分钟

Broadcast Receiver 是 Android 的一个组件,用于监听和处理系统广播消息,例如网络状态变化、电池电量、接收 SMS 或安装应用程序。它在事件发生时由操作系统启动,并在主线程或通过后台服务执行任务。根据 Android Developer Guide, 2026Broadcast Receiver 允许应用程序响应全局系统事件,即使它没有运行,这使其成为 Android 生态系统中后台事件处理的关键机制。

要点

  • Broadcast Receiver — 用于异步处理系统和用户广播消息的 Android 组件。
  • Ordered Broadcast 按优先级顺序传递,并且可以被任何接收器中断。
  • Normal Broadcast 同时传递给所有订阅者 — 处理顺序不保证。
  • 注册 可以是静态的(在清单中)和动态的(在代码中通过 registerReceiver)。
  • 限制 Android 8+ 禁止对许多隐式广播进行静态注册,从而减少后台负载。

什么是 Broadcast Receiver?

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 中的广播类型

Android 支持两种主要广播类型:Normal Broadcast 和 Ordered Broadcast。区别在于传递顺序和中断处理链的可能性。此外,广播分为系统广播(由操作系统生成)和用户广播(由应用程序创建)。

Normal Broadcast

Normal Broadcast 异步传递给所有已注册的接收器,且不保证顺序。系统可以并行处理此类广播 — 每个接收器在自己的线程中接收 Intent。在 Normal Broadcast 中调用 abortBroadcast 无效:无法取消传递给其他接收器。

Ordered Broadcast

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

Broadcast Receiver 可以通过两种方式注册:通过 AndroidManifest.xml 静态注册,或在代码中通过 registerReceiver 动态注册。选择取决于场景:静态注册即使应用程序没有运行也能工作,动态注册仅在注册组件活跃时工作。

静态注册

静态注册在清单中使用 <receiver> 标签在 <application> 内声明。对于每个接收器,指定处理程序类和它应该拦截的 Intent 过滤器。系统在广播发生时加载此类接收器,即使应用程序没有运行。

xml
<!-- 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 及更新版本中的限制

Android 8(API 26,Oreo)引入了关于后台广播的重大 限制。大多数隐式广播 — 那些不针对特定应用程序的广播 — 不再与静态注册一起使用。系统阻止清单中注册的接收器处理诸如 CONNECTIVITY_ACTION 或 ACTION_BATTERY_LOW 之类的操作。

发生了什么变化

Google 确定了继续使用静态注册的广播列表:BOOT_COMPLETED、TIME_TICK、Alarm、INSTANCE?(包更改) — 总共大约十个例外。所有其他隐式广播现在需要通过 Context.registerReceiver 进行动态注册,这仅在应用程序在前台时有效。

Broadcast Receiver 的替代方案

对于以前通过 Broadcast Receiver 解决的后台任务,Android 推荐 WorkManager(具有执行保证的延迟任务)、JobScheduler(考虑设备状态的定期任务)和 NotificationListenerService(通知监控)。这些组件在没有 Android 8 限制的情况下工作,并针对功耗进行了优化。

Kotlin 中的 Broadcast Receiver 示例

让我们考虑创建一个用于跟踪网络连接的 Broadcast Receiver。接收器将接收 CONNECTIVITY_ACTION 广播并记录连接类型。对于 Android 8+,我们将动态注册它,因为这是一个被排除在静态注册之外的隐式广播。

kotlin
// 用于网络状态跟踪的 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 的生命周期。

常见问题

Android 中的 Broadcast Receiver 是什么?

Broadcast Receiver 是用于处理系统和用户广播消息的 Android 组件。它在 onReceive 方法中接收 Intent,该方法在主线程中执行,并且必须在 10 秒内完成。对于长时间的任务,请使用 WorkManager 或 JobScheduler。

Normal Broadcast 和 Ordered Broadcast 有什么区别?

Normal Broadcast 异步并行传递给所有接收器 — 顺序不保证,abortBroadcast 不起作用。Ordered Broadcast 按优先级顺序传递,每个接收器可以中断链或通过 setResultExtras 传输数据。

静态注册和动态注册有什么区别?

静态注册(在清单中)允许接收器即使在应用程序没有运行时也能工作。动态注册(通过 registerReceiver)仅在注册组件活跃时工作。从 Android 8 开始,许多隐式广播需要动态注册。

Android 8 中为 Broadcast Receiver 引入了哪些限制?

Android 8(API 26)禁止了对大多数隐式广播的 静态注册,例如 CONNECTIVITY_ACTION 或 ACTION_BATTERY_LOW。例外包括 BOOT_COMPLETED、Alarm、时间和其他一些。对于后台任务,请使用 WorkManager 而不是广播。

如何将数据从 Broadcast Receiver 传输到 Activity?

使用 LiveData、StateFlow、EventBus 或 LocalBroadcastManager 将数据从 onReceive 传输到 UI。不要尝试直接从 onReceive 更新 UI — 它在主线程中执行,但接收器不保证 Activity 可见。LocalBroadcastManager 是用于内部通信的已弃用选项。

总结

  • Broadcast Receiver — 用于通过来自操作系统或其他应用程序的 Intent 消息接收和处理全局事件的系统 Android 组件。
  • Normal Broadcast 并行传递,不保证顺序;Ordered Broadcast 按优先级顺序传递,可以中断链。
  • 清单中的静态注册适用于尚未启动的进程,但在 Android 8+ 中对大多数隐式广播进行了 限制
  • 通过 registerReceiver 的动态注册需要强制调用 unregisterReceiver 以防止内存泄漏。
  • 系统广播包括 BOOT_COMPLETED、CONNECTIVITY_ACTION、BATTERY_LOW — 每个在 Intent Extras 中包含附加数据。
  • onReceive 的执行时间限制为 10 秒 — 对于长时间任务,从接收器启动 WorkManager 或 JobScheduler。
  • Android 8+ 中 Broadcast Receiver 的替代方案:WorkManager 用于后台任务,JobScheduler 用于定期任务,NotificationListenerService 用于通知监控。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读