定义
- android四大组件之一,
- 一个全局监听器,用来监听接收应用发出的消息
- 分为广播接收者和广播发送者
- 一般用来进行组件间通信,以及和android系统间通信比如监听网络状态,开机状态
原理
- 使用设计模式中的观察者模式,基于消息的发布订阅模型
- 模型示意图

image.png
分类及使用流程
## 广播分类
- 无序广播(普通广播)
- 系统广播:需要申请对应权限,注册对应广播接收者即可
- 有序广播
1. 发送出去的广播按照先后顺序进行接收
2. 通过设置priority属性值可以设置广播优先级,优先级相同,动态注册广播优先
3. 优先级高的广播可以通过调用BroadCastReceiver的abortBroadCast()方法终止广播,后面优先级低的则无法接收广播
4. 优先级高的广播可以通过setResultExtras(Bundle)将参数传递给优先级低的广播,低优先级的可以通过getResultExtras(true)获取参数
## 广播注册方式
- 静态注册
1. 直接在Androidmanifest文件中进行注册
```
<receiver android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="CCJJQQ"/>
</intent-filter>
</receiver>
```
2. receiver的属性值:
2.1 android:enabled 能否接收其他App的发出的广播
2.2 android:exported=["true" | "false"] 默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
2.3 android:permission="string" 具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收
2.4 android:process="string" BroadcastReceiver运行所处的进程,默认为app的进程,可以指定独立的进程
- 动态注册
在代码中进行注册
```
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("CCJJQQ");
registerReceiver(receiver,filter);
```
- 区别:动态注册广播生命周期和activity相同,而静态注册不受启动activity的影响
## 广播接收
```
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(Objects.equals(intent.getAction(), "CCJJQ"))
Toast.makeText(context,"cccq",Toast.LENGTH_SHORT).show();
}
}
```
## 广播发送
- 发送普通广播 sendBroadCast(intent);
- 发送有序广播 sendOrderBroadCast(intent);
- 发送粘性广播 sendStickyBroadCast(intent) 可以发送给未注册的广播
- 还有一种本地发送广播,只在本应用中发送广播,且必须动态注册
```
LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
```
# 注意点
- 广播接收在主线程,不能做耗时操作
- 需要取消注册
[参考链接] https://www.jianshu.com/p/ca3d87a4cdf3
网友评论