1.为啥需要它?
BroadcastReceiver 是 Android 的四大组件之一。用于监听和接收广播消息,并做出响应。
有以下一些应用:
- 不同组件之间的通信(应用内或不同应用之间)。
- 多线程之间通信。
- 与系统在特定情况下(例如,电话呼入时、网络可用时)的通信。
2.怎样使用它?
- 静态注册
public class CustomBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
Log.e("androidLog","onReceiver()");
}
}
AndroidManifest.xml
<receiver android:name=".CustomBroadcastReceiver">
<intent-filter>
<action android:name="com.hyh.broadcastreceiver"/>
</intent-filter>
</receiver>
- 动态注册
IntentFilter filter = new IntentFilter();
filter.addAction("com.hyh.broadcastreceiver");
registerReceiver(new CustomBroadcastReceiver(),filter);
- 发送广播
Intent intent = new Intent("com.hyh.broadcastreceiver");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//8.0以后必须指定,不然静态注册接收不到广播
intent.setComponent(
new ComponentName(this,"hyh.com.broastcastdemo.CustomBroadcastReceiver"));
}
sendBroadcast(intent);
- 程序内发送广播
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
3.它的原理是什么?
Android 中的广播机制使用了观察者设计模式:基于消息的发布、订阅事件模型。因此,广播的发送者和接收者解耦,使得系统方便集成,更容易扩展。
模型中有三个角色:
- 消息订阅者(广播接收者)
- 消息发布者(广播发送者)
- 消息中心(
ActivityManagerService
)
整个模型过程如下:
- 广播接收者通过 Binder 机制在 AMS 中注册订阅广播。
- 广播发送者通过 Binder 机制向 AMS 发送广播。
- AMS 根据广播发送者要求(IntentFilter、Permission),在已注册列表中寻找适合的接收者。
- AMS 将广播发送到合适的广播接收者相应的消息循环队列中。
- 广播接收者通过消息循环拿到广播,并回调
onReceive()
方法。
注:广播发送者和接收者的执行是异步的,发送者不会关心有无接收者接收,也不确定接收者何时才能接收到。