上次我们了解无序广播,今天我们来了解了解有序广播,有序广播是通过Context.sendOrderedBroadcast来发送。所有的receiver依次执行。
BroadcastReceiver可以使用setResult系列函数来结果传给下一个BroadcastReceiver,通过getResult系列函数来取得上个BroadcastReceiver返回的结果,并可以abort系列函数来让系统丢弃该广播让,使用该广播不再传送到别的BroadcastReceiver。它是通过在intent-filter中设置android:priority属性来设置receiver的优先级。优先级相同的receiver其执行顺序不确定。(即从优先级别最高的广播接收器开始接收,接收完了如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。)
下面我写了个系统有序广播的短信接收的例子:
public class MySMSReceived extends BroadcastReceiver {
private String body;
@Override
public void onReceive(Context context, Intent intent) {
if("android.provider.Telephony.SMS_RECEIVED".equals(intent.getAction())){
Log.i("test","有短信进来了");
//获取短信的内容
Bundle bundle=intent.getExtras();
Object[] objects= (Object[]) bundle.get("pdus");
SmsMessage[] smsMessages=new SmsMessage[objects.length];
for (int i = 0; i < objects.length; i++) {
smsMessages[i]=SmsMessage.createFromPdu((byte[])objects[i]);
}
//发送者
for (SmsMessage message : smsMessages) {
String address = message.getDisplayOriginatingAddress();
body = message.getDisplayMessageBody();
Log.i("test","发送人:"+ address);
Log.i("test","内容:"+ body);
}
if(body.contains("中奖了")){
//拦截
Log.i("test","拦截...");
abortBroadcast();
//删除短信(利用ContentProvider)
}
}
}
在AndroidManifest.xml中写如下代码:
<receiver android:name=".MySMSReceived">
<intent-filter
android:priority="1000"
>
<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
</intent-filter>
</receiver>
(里面的android:priority="100"就是设定广播接收器的级别,这个值从1000~-1000,数值越大,优先级别就越高。)
加上读取短信的权限
!--读取短信的权限-->
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
基本是都是这样了。