Broadcast 广播
用于在系统间传递消息的一个机制
广播的分类
普通广播的特点
- 同级别接收先后是随机的(无序)
- 级别低的后收到广播
- 接收器不能截断广播的继续传播也不能处理广播
- 同级别动态注册高于静态注册
有序广播的特点
- 同级别接收顺序是随机的
- 能截断广播的继续传递,高级别的广播接收器收到广播后可以决定是否截断该广播
- 接收器能截断广播,也可以处理广播
- 同级别动态注册高于静态注册
异步广播
- 不能将处理结果传递给下一个接收者,无法终止该广播
发送广播
- 广播的发送是通过Intent来实现的。Intent可以在进程之间发送结构化消息。
- 把信息装入一个Intent对象
- 通过调用相应的方法将Intent对象以广播的形式发送出去
- sendBroadcast() 发送一条普通广播
- sendOrderBroadcast() 发送一条有序广播
- sendStickyBroadcast() 发送一条异步广播
可以对Intent的动作、数据和分类进行设置,从而使BroadcastReceiver能够精确找到他们的需求。
Intent的动作字符串用来标识要广播的事件,所以它应该是唯一的,一般使用与Java包名相同的构建方法
Intent intent = new Intent();
intent.setAction("de.vogella.android.mybroadcast");
intent.putExtra(tag,msg);//Extras用于传递参数
sendBroadcast(intent);
Broadcast Receiver 广播接收者
用于接收发送出来的广播中的消息
BroadcastReceiver的生命周期只有10秒
在BraodcastReceiver里不能进行耗时操作,也不能使用子线程,
应该将消息传递给Service,由Service来完成,BroadcastReceiver在此只作为一个接收者,
接收广播
当intent发送以后,所有注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadReceiver的onReceive()方法。
当一个接收器与在注册接收器时使用的IntentFilter相匹配的Braodcast Intent的时候,会执行onReceive方法。onReceive处理程序必须在5秒钟内完成,否则会显示Force Close对话框
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// 取出intent中的Extra数据
String message = intent.getStringExtra("message");
Log.d("receiver", "Got message: " + message);
}
};
注册广播接收者
静态注册
//第一个name:要注册的BroadReceiver的类名
//第二个name:指定要监听的动作字符串
<receiver android:name="MyReceiver" >
<intent-filter>
<action android:name="de.vogella.android.mybroadcast" />
</intent-filter>
</receiver>
动态注册
影响特定Activity的UI的BraodcastReceiver通常在代码中动态注册。在代码中注册的接收器只会在包含它的应用程序组件时响应Broadcast Intent。
通常在onResume处理程序中注册接收器,并在onPause()中注销它
@Override
public void onResume() {
super.onResume();
//第一个参数:要注册的BroadReceiver的类名
//第二个参数:指定要监听的动作字符串
registerReceiver(mMessageReceiver,
new IntentFilter("my-event"));
}
@Override
protected void onPause() {
unregisterReceiver(mMessageReceiver);//注销BraodcastReceiver
super.onPause();
}