Broadcast是一种广泛运用的、在应用程序之间传输信息的机制,一个广播可以有任意个接收者。广播机制是一个典型的发布-订阅模式,也就是观察者模式。广播最大的特点是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦。
Android广播机制包含3个基本要素,分别是用于发送广播的Broadcast、接收广播的BroadcastReceiver以及用于传递信息的Intent。
首先我们需要定义一个广播接收器:
public class HelloBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "hello", Toast.LENGTH_LONG).show();
}
}
注册广播有两种:
- 静态注册,在AndroidManifest.xml里面注册广播监听,常驻内存,如果程序关闭,有相应事件触发,程序还是会被系统调用,接收广播:
<receiver android:name=".broadcast.HelloBroadcastReceiver">
<intent-filter>
<action android:name="hello">
</intent-filter>
</receiver>
里面receiver的android:name是广播接收处理的类,这个类需要继承BroadcastReceiver。然后action的android:name的是接收intent哪些广播。
- 动态注册,通过代码在java文件中进行注册,非常驻型,即跟随Activity生命周期,所以Activity的OnDestroy()中调用unregisterReceiver(receiver)方法移除它:
private void registerHelloBroadcast(){
registerReceiver(new HelloBroadcastReceiver(), new IntentFilter(HELLO_ACTION));
}
注册之后就可以发送广播了:
private void sendNormalBroadcast(){
sendBroadcast(new Intent(HELL_ACTION));
}
然后就会调用HelloBroadcastReceiver的onReceive函数,在该函数中执行相关代码操作即可。
有序广播
有序广播通过Context.sendOrderBroadcast()来发送,所有的广播接收器按照优先级依次执行,广播接收器的优先级通过receiver的intent-filter中的android:priority属性来设置,数值越大优先级越高。当广播接收器收到广播后,可以使用setResult()函数来把结果传给下一个广播接收器接收,然后通过getResult()函数来取得上个广播接收器返回的结果,并可以用abortBroadcast()函数让系统丢弃这个广播,使该广播不再传送到别的广播接收器。
设置广播的优先级:
<receiver android:name".broadcast.HelloBroadcastReceiver">
<intent-filter android:priority="100">
<action android="hello">
</intent-filter>
</receiver>
```
发送有序广播:
private void sendOrderBroadcast(){
sendOrderedBroadcast(new Intent(HELLO_ACTION), null);
}
***
**本地广播(LocalBroadcastManager)**
当我们并不需要把自己所有应用内的信息广播给所有应用,而只在进程内使用,使用LocalBroadcastManager就能够实现。
| 函数| 作用 |
| ------------- |:-----------------:|
|LocalBroadcastManager.getInstance(context).registerReceiver(receiver,intentFilter) |注册Receiver |
|LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver)| 注销Receiver |
| LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(HELLO_ACTION)) | 发送异步广播|
| LocalBroadcastManager.getInstance(context).sendBroadcastSync(new Intent()) |发送同步广播|