Broadcast 被分为如下两种:
- Normal Broadcast (普通广播) : Normal Broadcast 是完全异步的,可以在同一时刻(逻辑上)被所有的接收者收到,消息传递的效率比较高. 但是缺点是不能将处理结果传递给下一个接收者,并且无法终止 Broadcast Intent 的传播.
- Ordered Broadcast (有序广播) Ordered Broadcast 的接收者将按预先声明的优先级依次接受 Broadcast . 如A的级别高于B,B的级别高于 C ,那么 Broadcast 先传给A ,再传给 B, 最后传递给 C .优先级别声明在 (intent-filter…/)标签中 android:priority=”Xxx” Xxx的数值越大优先级越高,取值范围是 -1000~~~1000,优先级别也可以调用 IntentFilter对象的setPriority( )进行设置.Ordered Broadcast 接收者可以终止 Broadcast Intent 的传播. Broadcast Intent 的传播.一旦终止,后面的接收者无法接收到 Broadcast . 另外 rdered Broadcast的接收者,可以将数据传递给下一个接收者, 如 A 得到 Broadcast 后,可以往它的结果对象中存入数据,当 Broadcast 传给 B时,B 可以从A 的结果对象中,得到 A 存入的数据.
Context 提供如下两个方法 用于发送广播.
- sendBroadcast ( ): 发送 Normal Broadcast
- sendOrderedBroadcast ( ): 发送 Ordered Broadcast
对于 Ordered Broadcast来说,系统会根据接收者声明的优先级别按顺序逐个执行接收者,优先接受到的 Broadcast 的接收者,可以终止 Broadcast,调用 BroadcastReceiver的 abortBroadcast()方法即可终止 Broadcast.如果 Broadcast被前面的接收者终止,后面的接收者再也无法
获取到Broadcast.
对于 Ordered Broadcast来说 优先接受到的 Broadcast 的接收者,可以通过setResultExtras(Bundle) 方法将处理结果存入 Broadcast中,然后传递给下一个接收者,下一个接收者通过代码 Bundle budle = getResultExtras(true)
可以获取上一个接收者存入的数据.
package com.test.broadcastreceiverdemo.orderbroadcast;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.test.broadcastreceiverdemo.R;
/**
* 有序广播 OrderBroadcast
*/
public class SortedBroadcastActivity extends AppCompatActivity {
Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sorted_broadcast);
send = (Button) findViewById(R.id.order_button);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建 intent 对象
Intent intent = new Intent();
//设置Intent 的action 属性
intent.setAction("com.test.broadcastreceive.ORDERED_BROADCAST");
//设置数据
intent.putExtra("msg", "简单消息");
//发送广播
sendOrderedBroadcast(intent,null);
}
});
}
}
第一个 Receiver 广播接收者
package com.test.broadcastreceiverdemo.orderbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyOrderedReceiver extends BroadcastReceiver {
public MyOrderedReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context, "接收到的Intent 的action 为: " + intent.getAction() +
"\n 消息内容为: " + intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();
//创建一个 Bundle对象 并存入数据
Bundle bundle = new Bundle();
bundle.putString("first", "第一个BroadcastReceiver 存入数据 1");
//将 bundle 放入结果中
setResultExtras(bundle);
//取消 Broadcast 的继续广播
// abortBroadcast();
}
}
第二个 Receiver 广播接收者
package com.test.broadcastreceiverdemo.orderbroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyOrderedReceiver2 extends BroadcastReceiver {
public MyOrderedReceiver2() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Bundle bundle = getResultExtras(true);
//解析上一个 BroadcastReceiver 所存入的key 为 first的消息
String first = bundle.getString("first");
Toast.makeText(context, "第一个Broadcast存入的消息 为: 2" + first, Toast.LENGTH_SHORT).show();
}
}