第8章 广播机制
第8章 广播机制(Broadcast)
Android 广播机制用于:
系统或应用之间进行消息通信。
典型例子:
电量变化广播
网络变化广播
应用自定义广播(App 内或 App 间通信)
8.1 广播机制的概述
Android 中通信方式包括:
Activity 之间(Intent)
Service 与 Activity(绑定服务)
App 内或 App 间的全局消息广播(Broadcast)
广播分为两类:
系统广播(系统自动发出)
自定义广播(开发者自己发送)
广播由三个关键角色组成:
| 角色 | 作用 |
|---|---|
| 广播发送者 | 使用 sendBroadcast()、sendOrderedBroadcast() 发送广播 |
| 广播接收者(Receiver) | 接收广播消息 |
| IntentFilter | 匹配广播类型 |
8.2 广播接收者(BroadcastReceiver)
8.2.1 什么是广播接收者?
BroadcastReceiver 是 Android 四大组件之一。
主要作用:接收系统或应用发出的广播,并作出响应。
例如:
屏幕亮灭广播
网络变化
耳机插入
自定义事件(如“饭堂广播”)
8.2.2 创建广播接收者(静态 + 动态注册)
📌(1)静态注册:写在 AndroidManifest.xml 中
① 新建 Receiver 类
public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String msg = intent.getStringExtra("msg");Log.d("MyReceiver", "收到广播:" + msg);}
}
② Manifest 注册
<receiver android:name=".MyReceiver"><intent-filter><action android:name="com.example.MY_BROADCAST"/></intent-filter>
</receiver>
特点
App 不启动也能接收
常用于 BOOT_COMPLETED、电量广播等
📌(2)动态注册(在 Activity 中注册)
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("com.example.MY_BROADCAST");
registerReceiver(receiver, filter);
取消注册:
unregisterReceiver(receiver);
8.3 自定义广播与广播的类型
Android 广播可以分成 三种类型:
| 类型 | 特点 |
|---|---|
| 普通广播(sendBroadcast) | 异步发送,所有接收者同时接收 |
| 有序广播(sendOrderedBroadcast) | 有先后顺序,可拦截 |
| 粘性广播(已废弃) | 系统已不建议使用 |
8.3.1 自定义广播
自己定义 Action,然后发送广播。
发送广播
Intent intent = new Intent("com.example.MY_BROADCAST");
intent.putExtra("msg", "饭堂开饭啦!");
sendBroadcast(intent); // 普通广播
8.3.2 实战演练——饭堂小广播
场景:
两点半,饭堂大叔发广播“今天有红烧肉!”
应用收到后 Toast 提示。
步骤 1:创建广播接收器(CanteenReceiver)
public class CanteenReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {String food = intent.getStringExtra("food");Toast.makeText(context, "饭堂通知:" + food, Toast.LENGTH_SHORT).show();}
}
步骤 2:Manifest 注册
<receiver android:name=".CanteenReceiver"><intent-filter><action android:name="canteen.open"/></intent-filter>
</receiver>
步骤 3:按钮点击 → 发送广播
Intent intent = new Intent("canteen.open");
intent.putExtra("food", "今日红烧肉已开餐!");
sendBroadcast(intent);
运行效果:
点击按钮 → 弹出 Toast:饭堂通知:今日红烧肉已开餐!
8.4 广播的类型(详细说明)
8.4.1 普通广播(普通 sendBroadcast)
异步
所有 Receiver 同时收到
不能拦截
sendBroadcast(intent);
8.4.2 有序广播(sendOrderedBroadcast)
特点:
按优先级排序
前一个广播可以终止广播继续传递
可以修改广播内容
sendOrderedBroadcast(intent, null);
8.4.3 应用内广播(LocalBroadcastManager)
更安全
只在应用内部传播
没有泄露风险
虽然已弃用,但很多教材还在使用。
8.4.4 实战演练——数鸭子(有序广播)
场景:
按顺序让三个广播接收者喊出歌词:
“数鸭子,走起!”
“两只黄鹂鸣翠柳~”
“三只蚂蚁抬钢锯~”
步骤 1:三个 Receiver(Duck1,Duck2,Duck3)
Duck1Receiver
public class Duck1Receiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("duck", "1:数鸭子,走起!");}
}
Duck2Receiver
public class Duck2Receiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("duck", "2:两只黄鹂鸣翠柳~");}
}
Duck3Receiver
public class Duck3Receiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.d("duck", "3:三只蚂蚁抬钢锯~");}
}
步骤 2:设置优先级(Manifest)
<receiver android:name=".Duck1Receiver"><intent-filter android:priority="100"><action android:name="duck"/></intent-filter>
</receiver><receiver android:name=".Duck2Receiver"><intent-filter android:priority="50"><action android:name="duck"/></intent-filter>
</receiver><receiver android:name=".Duck3Receiver"><intent-filter android:priority="10"><action android:name="duck"/></intent-filter>
</receiver>
步骤 3:发送有序广播
Intent intent = new Intent("duck");
sendOrderedBroadcast(intent, null);
运行结果(Logcat):
1:数鸭子,走起!
2:两只黄鹂鸣翠柳~
3:三只蚂蚁抬钢锯~
第8章总结(写博客用)
| 知识点 | 内容 |
|---|---|
| 广播机制 | Android 全局消息通信方式 |
| 广播接收者 | BroadcastReceiver,用来接收广播 |
| 注册方式 | 静态(Manifest)/ 动态(Activity 内) |
| 自定义广播 | 自己定义 action,并通过 sendBroadcast 发送 |
| 广播类型 | 普通广播、有序广播、本地广播 |
| 实战 | 饭堂小广播、数鸭子有序广播 |
