返回

Android 广播的发送和接收 - 全面指南

Android

广播:Android 中的异步消息传递

引言

在 Android 开发中,广播是一种轻量级的异步消息传递机制,它允许组件跨越进程边界进行通信。它提供了松散耦合的方式,使组件彼此独立地运行,同时仍能有效地共享信息和事件。

广播的类型

在 Android 中,有四种主要的广播类型,每种类型都有自己的特性:

  • 无序广播: 这是最常见的广播类型。它不保证广播的顺序或接收顺序,使其成为发送简单信息的理想选择。
  • 有序广播: 有序广播以发送顺序传递,这对于协调依赖于特定顺序的复杂操作非常有用。
  • 粘性广播: 粘性广播被保留,直到有接收器接收它们为止,即使应用程序已关闭。它们非常适合存储需要长期保留的持续状态。
  • 局部广播: 局部广播仅在单个应用程序进程中发送和接收。它们对于应用程序内通信特别有用。

无序广播的发送和接收

无序广播是最简单的广播类型。要发送无序广播,您只需使用 sendBroadcast() 方法,该方法需要一个 Intent 对象作为参数。

要接收无序广播,您需要在应用程序清单文件中注册一个接收器,指定要接收的广播意图。然后,在接收器类中,实现 onReceive() 方法来处理广播。

代码示例:

发送无序广播:

Intent intent = new Intent("com.example.my.action");
context.sendBroadcast(intent);

接收无序广播:

public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 处理广播
    }
}

清单文件中接收器的注册:

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="com.example.my.action" />
    </intent-filter>
</receiver>

有序广播的发送和接收

有序广播与无序广播类似,但它们保证了按发送顺序接收广播。要发送有序广播,请使用 sendOrderedBroadcast() 方法。

要接收有序广播,您需要注册一个有序接收器,它还指定了一个 BroadcastReceiver.Result 对象来指示处理结果。

代码示例:

发送有序广播:

Intent intent = new Intent("com.example.my.ordered.action");
context.sendOrderedBroadcast(intent, null);

接收有序广播:

public class MyOrderedBroadcastReceiver extends BroadcastReceiver {

    @Override
    public BroadcastReceiver.Result onReceive(Context context, Intent intent) {
        // 处理广播
        return BroadcastReceiver.Result.CONTINUE;
    }
}

清单文件中有序接收器的注册:

<receiver android:name=".MyOrderedBroadcastReceiver">
    <intent-filter>
        <action android:name="com.example.my.ordered.action" />
    </intent-filter>
</receiver>

粘性广播

粘性广播是特殊类型的无序广播,在发送后被保留,直到有接收器接收它们为止。要发送粘性广播,请使用 sendStickyBroadcast() 方法。

要接收粘性广播,您需要注册一个普通接收器,并使用 registerReceiver() 方法中的 FLAG_RECEIVER_REGISTERED_ONLY 标志。

代码示例:

发送粘性广播:

Intent intent = new Intent("com.example.my.sticky.action");
context.sendStickyBroadcast(intent);

接收粘性广播:

IntentFilter intentFilter = new IntentFilter("com.example.my.sticky.action");
context.registerReceiver(myReceiver, intentFilter, null, null, FLAG_RECEIVER_REGISTERED_ONLY);

局部广播

局部广播仅在单个应用程序进程中发送和接收。它们对于应用程序内通信特别有用,因为它们允许组件在不需要跨越进程边界的开销的情况下进行通信。

要发送局部广播,请使用 sendBroadcast() 方法并指定 Context.RECEIVER_REGISTERED_ONLY 标志。

要接收局部广播,您需要注册一个接收器,并使用清单文件中 android:exported 属性将其标记为导出的。

代码示例:

发送局部广播:

Intent intent = new Intent("com.example.my.local.action");
context.sendBroadcast(intent, Context.RECEIVER_REGISTERED_ONLY);

接收局部广播:

<receiver android:name=".MyLocalBroadcastReceiver" android:exported="true">
    <intent-filter>
        <action android:name="com.example.my.local.action" />
    </intent-filter>
</receiver>

最佳实践

使用广播时,遵循一些最佳实践非常重要,以确保高效和可靠的通信:

  • 仅发送必要的信息,以避免不必要的开销。
  • 优先使用局部广播进行应用程序内通信。
  • 在不需要时取消注册接收器,以避免内存泄漏。
  • 使用意图作为广播的数据载体,以确保结构化的数据传递。
  • 谨慎使用有序广播,因为它们可能会阻塞发送进程。

常见问题解答

  1. 广播适合哪些类型的通信?
  • 广播适合发送简单的事件通知、状态更新和数据共享,不需要实时响应或同步。
  1. 如何选择正确的广播类型?
  • 无序广播适用于大多数情况。有序广播用于协调依赖于特定顺序的复杂操作。粘性广播用于存储需要长期保留的持续状态。局部广播用于应用程序内通信。
  1. 广播是否会阻塞发送进程?
  • 无序广播和局部广播不会阻塞发送进程。有序广播可能会阻塞发送进程,具体取决于接收器的处理结果。
  1. 如何防止广播泄漏?
  • 在不需要时取消注册接收器,并在应用程序关闭时注销所有接收器。
  1. 广播在 Android 中的用例是什么?
  • 广播用于各种用例,包括电池状态更新、网络连接更改、系统启动和关闭事件。它们还广泛用于应用程序内通信和跨进程数据共享。