一、相关概念
1、BroadcastReceiver
BroadcastReceiver是全局监听器,用于监听系统全局的广播消息,可以方便的实现系统中不同组件之间的通信
2、BroadcastReceiver的生命周期
与Service、Activity具有完整的生命周期不同,BroadcastReceiver本质上只是一个系统级的监听器,负责监听各程序所发出的Broadcast。
3、BroadcastReceiver的编码实现方式
a、编写类,继承BroadcastReceiver
b、AndroidManifest.xml中配置receiver ,此时自动完成注册;手动注册,使用registerReceiver()
c、调用BroadcastReceiver:
sendBroadcast(intent) 或者 sendOrderedBroadcast(intent2, null)
4、有序广播
普通广播:
普通广播是完全异步的,可以在逻辑上的同一时刻被所有接受者接收到,消息传递的效率很高。但缺点是接受者不能将处理结果传递给下一个接受者,并且无法终止BroadcastReceiver Intent的传播。
有序广播:
Ordered Broadcast的接收者按照预先声明的优先级依次接收Broadcast。
优先级 -1000到1000,数值越大优先级越高,在xml中通过priority或者编码setPriority设置;
通过sendOrderedBroadcast(intent2, null)启动有序广播;
在前一个BroadcastReceiver中设置处理结果通过setResultExtras(bundle)实现;
在后一个BroadcastReceiver中,通过Bundle bundle=getResultExtras(true);获取前面的处理结果;
通过abortBroadcast();取消继续广播
二、编码实现
activity中定义按钮点击事件,点击时发送广播
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_broad0:
Intent intent=new Intent("com.example.receiver.MyBroadcastReceiver");
intent.putExtra("data", "我是数据"+new Date().toLocaleString());
sendBroadcast(intent);
break;
case R.id.btn_broad1:
Intent intent2=new Intent("com.example.receiver.MyOrderedReceiver");
intent2.putExtra("data", "我是数据"+new Date().toLocaleString());
sendOrderedBroadcast(intent2, null);
break;
default:
break;
}
}
普通广播接收
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getExtras().getString("data").toString(), Toast.LENGTH_SHORT).show();
}
}
有序广播接收者1
public class MyOrderedReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle=intent.getExtras();
Toast.makeText(context, "receiver1"+bundle.getString("data").toString(), Toast.LENGTH_SHORT).show();
bundle=new Bundle();
bundle.putString("data2", "我是新数据");
//设置处理结果数据,级别低的BroadcastReceiver可以接收
setResultExtras(bundle);
}
}
有序广播接收者2
public class MyOrderedReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//获取前面BroadcastReceiver的处理结果
Bundle bundle=getResultExtras(true);
Toast.makeText(context, "receiver2"+bundle.getString("data2").toString(), Toast.LENGTH_SHORT).show();
abortBroadcast();//取消继续广播
}
}
<receiver android:name="com.example.receiver.MyBroadcastReceiver" > <intent-filter> <action android:name="com.example.receiver.MyBroadcastReceiver" /> </intent-filter> </receiver> <receiver android:name="com.example.receiver.MyOrderedReceiver1" > <intent-filter android:priority="10"> <action android:name="com.example.receiver.MyOrderedReceiver" /> </intent-filter> </receiver> <receiver android:name="com.example.receiver.MyOrderedReceiver2" > <intent-filter android:priority="1"> <action android:name="com.example.receiver.MyOrderedReceiver" /> </intent-filter> </receiver>