安卓-广播
在 Android 中,广播(Broadcast)是一种消息机制,允许应用程序之间或应用内部的不同组件(如活动、服务等)进行通信。广播可以用来发送和接收系统事件(如电池电量变化、网络连接状态改变等),也可以用于应用程序内的自定义消息传递。
一、Android 广播概述
广播机制允许一个应用向多个其他应用或系统组件发送消息,而接收方不需要事先知道谁发送了这些消息。广播分为两类:
- 系统广播:由系统发出的广播,用于通知设备状态的变化(如电量低、网络状态变化等)。
- 自定义广播:应用程序可以定义自己的广播,用于应用内不同组件间的通信。
二、广播的工作流程
广播机制的工作流程通常分为以下几步:
- 发送广播:通过
sendBroadcast()
、sendOrderedBroadcast()
或sendStickyBroadcast()
方法发送广播。 - 接收广播:广播接收器(
BroadcastReceiver
)负责监听特定的广播事件,并在广播到达时触发相应的回调方法。
三、定义广播接收器(BroadcastReceiver)
广播接收器是一个专门用于接收广播消息的组件。当广播发送到时,系统会调用广播接收器的 onReceive()
方法。
1. 静态注册广播接收器
静态注册广播接收器是在 AndroidManifest.xml
文件中声明的。这种方式适合监听系统级广播,比如网络状态变化、电池状态等。
步骤:
- 在
AndroidManifest.xml
中注册广播接收器。 - 重写
onReceive()
方法来处理广播。
示例:监听网络变化的广播
- 创建
BroadcastReceiver
子类:
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 当网络状态发生变化时触发
boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
if (noConnectivity) {
Toast.makeText(context, "Network disconnected", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "Network connected", Toast.LENGTH_SHORT).show();
}
}
}
- 在
AndroidManifest.xml
中注册广播接收器:
<receiver android:name=".NetworkChangeReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
2. 动态注册广播接收器
动态注册广播接收器是在代码中通过 registerReceiver()
方法来注册的。这种方式通常在需要只在应用的特定生命周期内监听广播时使用,比如在 Activity
或 Service
中注册和取消注册。
示例:动态注册广播接收器
public class MainActivity extends AppCompatActivity {
private NetworkChangeReceiver receiver = new NetworkChangeReceiver();
@Override
protected void onStart() {
super.onStart();
// 动态注册广播接收器
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(receiver, filter);
}
@Override
protected void onStop() {
super.onStop();
// 注销广播接收器
unregisterReceiver(receiver);
}
}
四、发送广播
Android 提供了多种发送广播的方法,可以根据广播的需求来选择不同的方式。
1. 普通广播(Normal Broadcast)
普通广播是无序的广播,它们是同时发给所有接收器的,所有广播接收器接收到的顺序不确定。使用 sendBroadcast()
方法发送普通广播。
示例:发送普通广播
Intent intent = new Intent();
intent.setAction("com.example.MY_ACTION");
sendBroadcast(intent);
2. 有序广播(Ordered Broadcast)
有序广播是按顺序发送的广播,广播接收器根据优先级依次接收广播。使用 sendOrderedBroadcast()
方法发送有序广播。接收器可以决定是否终止广播的传递。
示例:发送有序广播
Intent intent = new Intent();
intent.setAction("com.example.MY_ORDERED_ACTION");
sendOrderedBroadcast(intent, null);
接收器可以通过设置 android:priority
属性来定义接收优先级。
<receiver android:name=".MyReceiver">
<intent-filter android:priority="100">
<action android:name="com.example.MY_ORDERED_ACTION" />
</intent-filter>
</receiver>
3. 粘性广播(Sticky Broadcast)
粘性广播是一种广播在发送后仍然保留,接收器注册后可以立即接收到上次广播的数据。然而,从 Android 5.0 开始,sendStickyBroadcast()
方法已经被弃用,建议使用其他方式实现类似需求。
五、广播的应用场景
-
系统广播应用场景:
- 网络状态变化(
android.net.conn.CONNECTIVITY_CHANGE
) - 电池电量变化(
android.intent.action.BATTERY_CHANGED
) - 耳机插拔状态(
android.intent.action.HEADSET_PLUG
)
- 网络状态变化(
-
自定义广播应用场景:
- 应用内模块间的通信。例如,某个模块处理完数据后需要通知 UI 更新。
- 当应用中的某些事件发生时通知其他组件,比如下载完成通知。
六、广播的最佳实践
-
动态广播接收器的使用:对于涉及应用生命周期的广播,最好使用动态注册的方式。动态注册广播接收器时,确保在不需要监听时注销广播,以避免内存泄漏。
-
避免使用粘性广播:粘性广播已被废弃,不建议使用。如果需要类似的功能,可以使用
SharedPreferences
或LiveData
等机制来代替。 -
广播权限控制:广播可能涉及敏感数据或操作,应该通过权限控制限制广播的接收者。可以通过为广播接收器和发送广播设置权限来确保数据的安全性。
示例:发送有权限控制的广播
sendBroadcast(intent, "com.example.permission.MY_BROADCAST_PERMISSION");
七、总结
广播机制在 Android 中为不同组件之间的通信提供了灵活的方式,尤其是系统广播可以帮助应用了解设备状态的变化。通过广播接收器可以监听系统级事件或自定义事件,并根据接收到的消息触发相应的逻辑。