发送有序广播
a. sendOrderedBroadcast() 发送有序广播;
b. 通过Intent确定广播类型, 携带数据,Intent的数据同样修改无效;
c. 跟普通广播一样,也可以设置相应的权限;
d. 接收者可在定义android:priority定义优先级,数字越大,优先级越高;
e. 有序广播会被接收者逐个接收,中途可以中断,或添加、修改数据;
f. 可以指定一个自己的广播接收者, 这个接收者将最后一个收到广播、不会被中断、不需要任何权限、不需要配置;
g. 可以指定一个Handler用来在自己的接收者中进行线程通信;
发送者:
Intent intent = new Intent(“com.itheima.broadcast.TEST”); // 指定动作;接收者,需要配置 intent filter才能接受到此广播
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); // 包含未启动的过的应用(也可以收到广播),默认为不包含
intent.putExtra(“data”, “这是来着广播发送者发来的贺电”); // 广播发送者的intent中的数据,接收者,修改不了
// == 有序广播时,传递的数据可修改 ==
Bundle bundle = new Bundle();
bundle.putString(“name”, “关羽”);
bundle.putInt(“age”, 22);
/* 定义权限,要求接收者,要有 com.itheima.permission.broadcast.RECEIVE 才能接收;
* 配置了最后接收者,Creceiver,无论你们怎么弄,我都可以收到广播,而且我不要配置,不要权限
* handle为null,表示使用系统默认的
* 传递了数据 1, “MainActivity”, bundle 这些都是可以在接收者修改的
*/
this.sendOrderedBroadcast(intent, “com.itheima.permission.broadcast.RECEIVE”, new CReceiver(), null, 1, “MainActivity”, bundle);
<permission android:name="com.itheima.permission.broadcast.RECEIVE" >
接收者AReceive:
public void onReceive(Context context, Intent intent) {
System.out.println(“AReceiver: ” + intent.getStringExtra(“data”));
Bundle bundle = this.getResultExtras(true); // 设置为true,表示即使没有传递Bundle数据,不会出现空指针
String message = String.format(“%s : %s : %s, %s”, getResultCode(), getResultData(), bundle.getString(“name”), bundle.getInt(“age”));
System.out.println(message); // 如果优先级高于其他接收者,将打印发送者的数据
// == 修改有序发送者,发来的数据 ==
bundle.putString("name", "赵子龙");
bundle.putInt("age", 222);
this.setResult(2, "AReceiver", bundle);
// == 修改Intent中的数据,无效 ==
intent.putExtra("data", "AReceiver 修改了数据");
this.setResultData("这是来自AReceiver的信息");
// this.abortBroadcast(); // 中断,比它优先级低的接收者,将不能接收到广播了
}
//-- 要求广播发送者必须有对应的权限,我才收
<receiver android:name="com.itheima.a.AReceiver"
android:permission="com.itheima.permission.broadcast.RECEIVE" >
<intent-filter android:priority="2" >
<action android:name="com.itheima.broadcast.TEST" />
</intent-filter>
</receiver>