![](https://img.haomeiwen.com/i1836565/2c6631afd7a1ca62.png)
一、原理
![](https://img.haomeiwen.com/i1836565/f197db650db3e503.png)
- 广播接收者通过Binder驱动在AMS中注册
- 广播发送者通过Binder驱动发送广播到AMS
- AMS根据广播发送者的要求,在注册列表中找到满足条件的广播接收器(IntentFilter、Permisson),将广播发送到广播接收器的消息循环队列中
- 广播接收器通过消息循环拿到此广播,并回调onReceive()方法
二、使用
1. 注册广播
静态注册
静态注册的广播接收器在应用安装时将该广播接收器注册到AMS中
<receiver
android:enabled=["true"|"false"]// 此广播接收器是否能接收其他APP发出的广播
android:exported=["true"|"false"]// 是否支持其他应用调用当前组件(此默认值是由receiver中有误intent-filter决定的:Y-true;N-false)
android:icon="drawable resource"
android:label="string resource"
android:name=".mbroadcasrReceiver"
android:permisson=""// 具有相应权限的广播发送者发送的广播才能被此receiver接收
android:process="" // 指定自己想去的进程>
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
动态注册
一般在onResume()中注册,对应的在onPause()中取消注册
注册普通广播
protected void onResume(){
super.onResume();
MyReceiver mReceiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
regiterReceiver(mReceiver,intentFilter);
}
protected void onPause(){
super.onPause();
unregisterReceiver(nReceiver);
}
注册应用内广播
//步骤1:实例化BroadcastReceiver子类 & IntentFilter
MyReceiver mReceiver = new MyReceiver ();
IntentFilter intentFilter = new IntentFilter();
//步骤2:设置接收广播的类型
intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
//步骤3:实例化LocalBroadcastManager的实例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
//步骤4:调用LocalBroadcastManager单一实例的registerReceiver()方法进行动态注册
localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);
//取消注册应用内广播接收器
localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
二者对比
![](https://img.haomeiwen.com/i1836565/51074fea2670750e.png)
2. 发送广播
发送普通广播
Intent intent=new Intent();
intent.setAction(BROADCAST_ACTION);
// 发送广播
sendBroadcast(intent);
发送应用内广播
Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
localBroadcastManager.sendBroadcast(intent);
网友评论