BroadcastReceiver广播接听器的初步认识,广播优先级,中断,权限,广播暴露(3)
/**
* 按广播类型分:
* 1.无序广播,广播接收器收到的广播顺序时随机的,没有顺序可循
* 2.有序广播(你懂的)
*/
从一个应用A中发送广播给另一个应用B的代码操作工程。
首先,在清单文件中声明定义一个广播权限,两个应用的清单文件都要有
<permission
android:name="custom.permission"
android:protectionLevel="normal" />
<uses-permission android:name="custom.permission" />
应用A中设置的代码逻辑如下:点击Button按钮方法发送一个广播
sendBroadcast(1,2)里面的两个参数,第一个参数是意图名称,第二个人参数就是应用广播访问权限
public void send(View view){
sendBroadcast(new Intent("weihuan.weigongcheng"),"custom.permission");
}
在该方法执行后,B应用中所有设置为该意图名称的广播接收器都会接收到广播消息。
效果如下Log.d的打印结果:
06-02 14:42:12.193 1957-1957/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive2: null
06-0214:42:12.1931957-1957/project.wgc.mybroadcastreceiver02D/weihuan:onReceive5:resultData:null;resultCode:-1;nickname:null
06-0214:42:12.2091957-1957/project.wgc.mybroadcastreceiver02D/weihuan:onReceive4:resultData:null;resultCode:0;nickname:null
06-02 14:42:12.218 1957-1957/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive3: 3
五个自定义广播器的代码如下:
public class MyReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("weihuan", "MyReceiver1: ++++++++++++++++");
}
}
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String username = intent.getStringExtra("username");
Log.d("weihuan", "onReceive2: "+username);
}
}
public class MyReceiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("weihuan", "onReceive3: 3");
}
}
public class MyReceiver4 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
int resultCode = getResultCode();
//参数表示如果广播发送者传递的bundle为null,则系统自动创建新的Bundle
Bundle resultExtras = getResultExtras(true);
String nickname = resultExtras.getString("nickname");
Log.d("weihuan", "onReceive4: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);
//中断广播
abortBroadcast();
}
}
public class MyReceiver5 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
int resultCode = getResultCode();
//参数表示如果广播发送者传递的bundle为null,则系统自动创建新的Bundle
Bundle resultExtras = getResultExtras(true);
String nickname = resultExtras.getString("nickname");
Log.d("weihuan", "onReceive5: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);
setResultData("lisi");
setResultCode(28);
resultExtras.putString("nickname", "里斯");
setResultExtras(resultExtras);
}
}
在清单文件中静态注册四个广播接收器,二号广播接收器在代码中动态注册
<!--
android:exported="false"是否将广播接收器暴露给第三方应用,上面应用A发送的广播信息,一号广播接收器就不会收到了
-->
<receiver android:name=".MyReceiver1"
android:exported="false">
<intent-filter>
<action android:name="weihuan.weigongcheng" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver3">
<intent-filter android:priority="1">
<action android:name="weihuan.weigongcheng" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver4">
<intent-filter android:priority="2">
<action android:name="weihuan.weigongcheng" />
</intent-filter>
</receiver>
<!--
android:priority="3" 表示广播的优先级,优先级越高的广播接收器越先收到广播,最低优先级为-999
-->
<receiver android:name=".MyReceiver5">
<intent-filter android:priority="3">
<action android:name="weihuan.weigongcheng" />
</intent-filter>
</receiver>
B应用中的主要代码如下:
public class MainActivity extends AppCompatActivity {
private MyReceiver2 receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver = new MyReceiver2();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("weihuan.weigongcheng");
//"custom.permission“第三个参数表示要监听的权限
registerReceiver(receiver,intentFilter,"custom.permission",null);
}
public void send1(View view) {//发送无序广播
Intent intent = new Intent("weihuan.weigongcheng");
intent.putExtra("username", "zhangsan");
sendBroadcast(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
public void send2(View view) {//发送有序广播
// Intent intent = new Intent("android.android");
// intent.putExtra("age", 18);
// sendOrderedBroadcast(intent, null);
Bundle bundle = new Bundle();
bundle.putString("nickname", "张三");
sendOrderedBroadcast(new Intent("weihuan.weigongcheng"), null, new MyReceiver3(), null, 18, "zhangsan", bundle);
// sendOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)
// receiverPermission 这是权限,一个接收器必须持以接收您的广播。如果为 null ,不经许可的要求。
// resultReceiver 您自己 BroadcastReceiver 来当作最后的广播接收器。
// 调度自定义处理程序,用以安排 resultReceiver 回调 ; 如果为 null 将语境中的主线程举行。
// initialCode 一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ;
// initialData 一种结果数据的初始值。通常情况下为空 , 是 String 类型 ;
// initialExtras 一种结果额外的初始值。通常情况下为空 , 是 Bundle;
}
}
点击方法一send1发送无序广播,效果如下2-5-4-3-1:
06-02 15:08:15.024 19631-19631/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive2: zhangsan
06-0215:08:15.02519631-19631/project.wgc.mybroadcastreceiver02D/weihuan:onReceive5:resultData:null;resultCode:-1;nickname:null
06-0215:08:15.04019631-19631/project.wgc.mybroadcastreceiver02D/weihuan:onReceive4:resultData:null;resultCode:0;nickname:null
06-02 15:08:15.043 19631-19631/project.wgc.mybroadcastreceiver02 D/weihuan: onReceive3: 3
06-02 15:08:15.047 19631-19631/project.wgc.mybroadcastreceiver02 D/weihuan: MyReceiver1: ++++++
点击方法二send2中,
sendOrderedBroadcast(new Intent("weihuan.weigongcheng"), null, null, null, 18, "zhangsan", bundle);
// sendOrderedBroadcast(intent, resultReceiver, scheduler, initialCode, initialData, initialExtras)
// receiverPermission 这是权限,一个接收器必须持以接收您的广播。如果为 null ,不经许可的要求。
// resultReceiver 您自己 BroadcastReceiver 来当作最后的广播接收器。
// 调度自定义处理程序,用以安排 resultReceiver 回调 ; 如果为 null 将语境中的主线程举行。
// initialCode 一种结果代码的初始值。通常为 Activity.RESULT_OK 。这个值是 -1 ;为其他 int 型 也可以,如 0,1,2 ;
// initialData 一种结果数据的初始值。通常情况下为空 , 是 String 类型 ;
// initialExtras 一种结果额外的初始值。通常情况下为空 , 是 Bundle;
第三个参数如果设置有receiver,则该方法发送的广播信息最后结束的时候一定会在该receiver结束。下面是有与没有的结果对比
1、设置有receiver:从优先级高到低:5-4-3-2-1-3(3是设置的receiver)
D/weihuan:onReceive5:resultData:zhangsan;resultCode:18;nickname:张三
D/weihuan: onReceive4: resultData:lisi;resultCode:28;nickname:里斯
D/weihuan: onReceive3: 3
D/weihuan: onReceive2: null
D/weihuan: MyReceiver1: +++
D/weihuan: onReceive3: 3
2、没设置有receiver:从优先级高到低:5-4-3-2-1
D/weihuan: onReceive5: resultData:zhangsan;resultCode:18;nickname:张三
D/weihuan: onReceive4: resultData:lisi;resultCode:28;nickname:里斯
D/weihuan: onReceive3: 3
D/weihuan: onReceive2: null
D/weihuan: MyReceiver1: +++
在方法send2中时初始发送数据如下:
Bundle bundle = new Bundle();
bundle.putString("nickname", "张三");
sendOrderedBroadcast(new Intent("weihuan.weigongcheng"), null, new MyReceiver3(), null, 18, "zhangsan", bundle);
根据优先级大小,会从依次54321。
在监听器5中更改了初始数据,所以监听器4接收到更改后的数据
public class MyReceiver5 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
int resultCode = getResultCode();
//参数表示如果广播发送者传递的bundle为null,则系统自动创建新的Bundle
Bundle resultExtras = getResultExtras(true);
String nickname = resultExtras.getString("nickname");
Log.d("weihuan", "onReceive5: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);
setResultData("lisi");//重新设置结果数据为lisi
setResultCode(28);//重新设置结果代码为28
resultExtras.putString("nickname", "里斯");//重新设置结果Bundle中的昵称为"里斯"
setResultExtras(resultExtras);
}
}
public class MyReceiver4 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String resultData = getResultData();
int resultCode = getResultCode();
//参数表示如果广播发送者传递的bundle为null,则系统自动创建新的Bundle
Bundle resultExtras = getResultExtras(true);
String nickname = resultExtras.getString("nickname");
Log.d("weihuan", "onReceive4: resultData:" + resultData + ";resultCode:" + resultCode + ";nickname:" + nickname);
//中断广播
// abortBroadcast();
}
}
监听器4中的abortBroadcast();代表中断广播的意思,即执行后,广播就会停止,不会再往下传播。从5到4就完了。
监听器5到4的log.d的结果显示
D/weihuan:onReceive5:resultData:zhangsan;resultCode:18;nickname:张三
D/weihuan: onReceive4: resultData:lisi;resultCode:28;nickname:里斯