Broadcast分为两种广播,普通广播,是异步的,可以在同一时刻被所有接收者收到,消息传递效率比较高,但缺点是接收者不能将结果传递给下一个接收者,且无法终止Broadcast Intent的传播
有序广播的接收者则将按预先声明的优先级依次接收Broadcast.如A高于B,了高于C,那么执行顺序为A到B到C.优先级声明在<intent-filter.../>元素的android:priority属性中,数字越大优先级越高.取值范围为-1000~1000,先可以在代码中调用IntentFilter对象的setPriority()进行设置.
发送有序广播的方法为sendOrderedBroadcast()
优先接收到Broadcast的接收者可以通过setResultExtras(Bundle)方法将处理结果存入Broadcast中,然后传给下一个接收者,
下一个接收者通过Bundle bundle = new getResultExtras(true)可以获取上一个接收者存入的数据
下面是一个例子,共定义了两个receiver
package WangLi.Service.SortedBroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(
context,
"接收到的Intent的Action为:" + intent.getAction() + "\n消息内容是:"
+ intent.getStringExtra("msg"), 5000).show();
//创建一个Bundle对象,并存入数据
Bundle bundle = new Bundle();
bundle.putString("first", "第一个BroadcastReceiver存入的消息");
//将bundle放入结果中
setResultExtras(bundle);
//取消Broadcast的继续发送
abortBroadcast();
}
}
package WangLi.Service.SortedBroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
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");
Toast.makeText(context,"第一个Broadcast存入的消息为:" + first, 5000).show();
}
}
配置两个receiver的优先级
<receiver android:name="MyReceiver" >
<intent-filter android:priority="20">
<action android:name="WangLi.Test.OrderBroadcast" />
</intent-filter>
</receiver>
<receiver android:name="MyReceiver2" >
<intent-filter android:priority="0">
<action android:name="WangLi.Test.OrderBroadcast" />
</intent-filter>
</receiver>
一个是20,一个是0,显然是先执行优先级为20的那个接收者
注意MyReceiver里的取消Broadcast继续发送的代码
abortBroadcast();
如果注释它,那么MyReceiver2 也会得到执行,即按顺序,先出现画面1,再出现画面2
画面1
画面2
如果不注释掉这行代码,那么执行中只会运行MyReceiver,没有MyReceiver2,所以只会出现画面1