在Android中,广播(Broadcast)是一种全局的消息传递机制,用于在不同组件(如Activity、Service、Fragment)甚至不同应用之间传递事件。以下是关于广播的详细介绍:
一、广播的核心概念
广播分为三种类型:
-
普通广播(Normal Broadcast)
- 异步发送,所有接收器并行接收,无法中断。
- 使用
sendBroadcast()发送。
-
有序广播(Ordered Broadcast)
- 同步发送,按优先级依次传递给接收器,可被拦截或修改数据。
- 使用
sendOrderedBroadcast()发送。
-
粘性广播(Sticky Broadcast)
- 已废弃(Android 5.0+),允许在发送后仍能被后续注册的接收器接收。
二、广播的创建步骤
1. 定义广播接收器(BroadcastReceiver)
// 方式一:静态注册(在AndroidManifest.xml中声明)
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.example.MY_CUSTOM_ACTION" />
</intent-filter>
</receiver>
// 方式二:动态注册(在代码中注册)
public class MainActivity extends AppCompatActivity {
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("com.example.MY_CUSTOM_ACTION")) {
String data = intent.getStringExtra("key");
Log.d("MainActivity", "Received: " + data);
}
}
};
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter("com.example.MY_CUSTOM_ACTION");
registerReceiver(receiver, filter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver); // 避免内存泄漏
}
}
2. 发送广播
// 发送普通广播
Intent intent = new Intent("com.example.MY_CUSTOM_ACTION");
intent.putExtra("key", "Hello from sender");
sendBroadcast(intent);
// 发送有序广播(带权限和结果接收器)
sendOrderedBroadcast(intent, null, null, null,
Activity.RESULT_OK, null, null);
三、广播的典型使用场景
1. 系统事件监听
监听网络变化、电量变化、屏幕开关等系统事件:
// 监听网络连接变化
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager cm = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
Log.d("NetworkReceiver", "Network connected");
} else {
Log.d("NetworkReceiver", "Network disconnected");
}
}
}
2. 组件间通信
在Activity、Service、Fragment之间解耦通信:
// 在Service中发送广播通知Activity
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 任务完成后发送广播
Intent broadcastIntent = new Intent("com.example.TASK_COMPLETED");
sendBroadcast(broadcastIntent);
return START_STICKY;
}
}
3. 跨应用通信
允许不同应用之间传递数据:
// 发送跨应用广播(需指定包名或权限)
Intent intent = new Intent("com.example.EXTERNAL_ACTION");
intent.setPackage("com.other.app"); // 指定目标应用包名
sendBroadcast(intent);
4. 后台任务通知
在后台任务完成时通知UI更新:
// 文件下载完成后通知Activity
public class DownloadService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
// 下载文件...
Intent broadcastIntent = new Intent("com.example.DOWNLOAD_COMPLETED");
sendBroadcast(broadcastIntent);
}
}
四、广播的优缺点
优点
- 解耦组件:发送者和接收者无需直接引用。
- 系统级通知:可监听系统事件(如网络变化)。
- 跨进程通信:支持不同应用间传递数据。
缺点
- 性能开销:广播机制涉及反射和全局消息传递,频繁使用会影响性能。
- 安全风险:静态广播可能被恶意应用拦截或利用。
- 不可靠性:广播发送后无法保证接收者一定能处理。
五、替代方案(优先考虑)
-
LocalBroadcastManager
- 仅在应用内传播,更安全高效:
// 注册本地广播 LocalBroadcastManager.getInstance(context) .registerReceiver(receiver, new IntentFilter("LOCAL_ACTION")); // 发送本地广播 LocalBroadcastManager.getInstance(context) .sendBroadcast(new Intent("LOCAL_ACTION")); -
EventBus/RxJava
- 基于观察者模式的事件总线,更适合组件间通信:
// 使用EventBus发送事件 EventBus.getDefault().post(new MyEvent("Data")); // 订阅事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onMyEvent(MyEvent event) { // 处理事件 } -
ViewModel + LiveData
- 适合Activity与Fragment间的通信,生命周期安全:
// ViewModel中定义LiveData public class SharedViewModel extends ViewModel { private final MutableLiveData<String> data = new MutableLiveData<>(); public void setData(String value) { data.setValue(value); } public LiveData<String> getData() { return data; } }
六、使用建议
- 优先使用LocalBroadcast:避免全局广播的安全风险和性能开销。
- 减少静态广播:Android 8.0+对隐式静态广播有限制,建议动态注册。
- 避免在广播中执行耗时操作:可能导致ANR(Application Not Responding)。
- 注意内存泄漏:动态注册的广播必须在
onDestroy()中取消注册。
总结
广播是Android中强大的通信机制,但需谨慎使用。在大多数场景下,LocalBroadcastManager、EventBus或ViewModel是更优选择,仅在需要系统级事件监听或跨应用通信时才使用全局广播。

1202

被折叠的 条评论
为什么被折叠?



