BroadcastReceiver是Android一个重要的组件,代表广播消息接收器,从代码实现角度来看,BroadcastReceiver非常类似于事件编程中的监听器。不过与普通事件监听器不同的是:普通事件监听器监听的事件源是程序中的对象,比如Button、TextView等各组件,而BroadcastReceiver监听的事件源是Android中的其他组件,比如WiFi、蓝牙、系统联系人等等组件
在Android中,广播可以分为两种:一种是系统自带的广播(系统中自带大量的广播,这些广播是由操作系统发送的,我们只需要注册一个BroadcastReceiver程序接收广播即可),还有一种就是我们可以自己定义的广播(自己定义的广播由我们自己控制什么时候发送广播)。
自定义广播
如果是自定义广播,一般需要以下几个步骤:
定义广播的action字符串,注意该字符串不能与系统自带的广播action字符串相同。
// 定义action字符串,值可以随便填,但不能与系统自带的字符串相同 private String actionString = "zhe.li.sui.bian.tian";
定义广播接收类
public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到的Action是" + intent.getAction() + ",接收到的内容是:" + intent.getStringExtra("msg"), Toast.LENGTH_LONG).show(); } }
注册广播
注册广播有两种方法,一种是用Java代码,另外一种是在AndroidMainfest.xml里面配置。
xml配置,注意这里的action值要和之前定义的actionString变量保持一致。
<receiver android:name=".MyBroadcastReceiver"> <intent-filter> <action android:name="zhe.li.sui.bian.tian" /> </intent-filter> </receiver>
Java代码
//注册广播 IntentFilter intent = new IntentFilter(); intent.addAction(actionString); MyBroadcastReceiver receiver = new MyBroadcastReceiver(); registerReceiver(receiver, intent);
发送广播
sendBroadcast(new Intent(actionString));
系统广播
和自定义广播使用方法差不多,不过系统的广播不允许我们在代码中发送,系统广播都由系统根据系统的变化自动发送,如果我们强行调用sendBroadcast是会报错的。这个其实不难理解,比如说我们开启蓝牙的时候,系统会发一条广播出来,如果允许你随便发送,结果你明明没有开启,你发送一条广播出来告诉我,你把蓝牙开了,你忽悠谁呢啊。。
有序广播
Broadcast被分为如下两种广播:
Normal Broadcast(普通广播):普通广播是完全异步的,可以在同一时刻被所有广播接收者接收到,广播接受者之间无任何联系,这种广播消息传递的效率比较高,但缺点是接收者不能将处理结果传递个下一个接收者,并且无法终止Broadcast Intent的传播。
Ordered Broadcast(有序广播):有序广播的接收者将按预先声明的优先级依次接收Broadcast。如:A的级别高于B,B的优先级别高于C,那么Broadcast先传给A,再传给B,最后传给C。相比普通广播的话,有序广播有以下特性:
优先级别声明在
<intent-filter.../>
元素的android:priority
属性中,数越大优先级别越高,取值范围为-1000到1000Ordered Broadcast的接收者可以终止Broadcast Intent的传播,比如广播传给A,A处理之后他终止了,这样后面的接收者B和接收者C就都接收不到广播了
Ordered Broadcast的接收者可以将数据传递给下一个接收者,比如A得到广播之后,可以将A的相关数据保存在广播中,这样再往下传的时候B就可以接收到A存入的数据了。
Context提供了下面两个方法分别用于发送普通广播和有序广播
sendBroadcast():发送普通广播
sendOrderedBroadcast():发送有序广播
下面讲解下有序广播的使用方法,包括以下几点:
定义两个有序广播的接收者
public class MyReceive1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 创建一个Bundle对象,并存入数据 Bundle bundle = new Bundle(); bundle.putString("first", "第一个BroadcastReceiver存入的数据"); //将bundle放入结果中 setResultExtras(bundle); //取消Broadcast的继续传递 // abortBroadcast(); } }
public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = getResultExtras(true); // 解析前一个BroadcastReceiver所存入的key为first的数据 String first = bundle.getString("first"); Log.e("BroadcastReceiver", "第一个BroadcastReceiver存入的消息为:" + first); } }
注册广播并设置广播接收的优先级别,这里我们可以直接xml文件中设置,也可以用代码来设置
XML代码设置
<receiver android:name=".MyReceive1"> <intent-filter android:priority="100"> <action android:name="you_xu_guang_bo"/> </intent-filter> </receiver> <receiver android:name=".MyReceiver2"> <intent-filter android:priority="0"> <action android:name="you_xu_guang_bo"/> </intent-filter> </receiver>
Java代码设置
//注册广播 IntentFilter intentFilter1 = new IntentFilter(); intentFilter1.setPriority(100); intentFilter1.addAction("you_xu_guang_bo"); registerReceiver(new MyReceive1(), intentFilter1); IntentFilter intentFilter2 = new IntentFilter(); intentFilter2.setPriority(0); intentFilter2.addAction("you_xu_guang_bo"); registerReceiver(new MyReceiver2(), intentFilter2);
发送广播
sendOrderedBroadcast(new Intent("you_xu_guang_bo"), null);