一、相关概念
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>