Android 通过广播进行进程间通信
android 进程间广播通信
项目需求,和同事分别开发两个应用程序,其中一个功能点是需要同事给我发送具体信息,我接收到这个信息后。做其他具体处理。很早之前有用过。后来好久不用了,今天使用,查了些其他资料,来记录一下。方便以后可以直接使用。
Android 8.0前进程间广播通信
两个APP, A.apk,B.apk ;
A需要向B通过广播发送消息。
第一步,B 中在mainfast 文件中注册接收广播
<receiver android:name=".broadcast.MyBoradCast">
<intent-filter>
<action android:name="com.cn.broadcast.test.ACTION"/>
</intent-filter>
</receiver>
第二步,B 中创建自定义 广播类 接收广播
public class MyBoradCast extends BroadcastReceiver {
public static final String BROADCAST_ACTION_TEST = "com.cn.broadcast.test.ACTION";
@Override
public void onReceive(Context context, Intent intent) {
if (BROADCAST_ACTION_TEST .equals(intent.getAction())){
Bundle bundle = intent.getExtras();
String test = (String) bundle.get("text");
Log.i("测试接收到广播:",test );
}
}
}
第三步,A 中创建 发送广播
public static final String BROADCAST_ACTION_TEST = "com.cn.broadcast.test.ACTION";
...
...
// 通过Intent类的构造方法指定广播的ID
Intent intent = new Intent(BROADCAST_ACTION_TEST );测试接收到广播
// 将要广播的数据添加到Intent对象中
intent.putExtra("text", "测试发送广播");
// 发送广播
sendBroadcast(intent);
到此处就可以了,运行 第三步 发送广播,则可在A 中收到B 发送的信息。
Android 8.0 进程间广播通信
Android 8.0 部分广播 不能进行静态注册。此处我们使用动态注册。
静态注册,也就是说在AndroidManifest文件中对BroadcastReceiver进行注册,通常还会加上action用来过滤。
动态注册,调用Context中的registerReceiver对广播进行动态注册,使用unRegisterReceiver方法对广播进行取消注册的操作。
仍然是 两个APP, A.apk,B.apk ;
A需要向B通过广播发送消息。
第一步,A 定义权限,并且使用自定义权限
<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
<permission
android:name="com.cn.customview.permissions.MY_BROADCAST"
android:protectionLevel="signature" >
</permission>
注意:android:protectionLevel=”signature” 如果是同一个应用可以这么声明,如果跨app发送广播(比如A app向B app发送广播),则需要去掉android:protectionLevel=”signature”。
第二步,B 注册广播
BroadcastReceiver boradCast = new MyBoradCast();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION_DISC);
//第三个参数为权限,如果没有其他注意事项可以不加,此处做权限限制,目的是只为收取 BROADCAST_PERMISSION_DISC 权限广播。
//(*****
//有个好处,如果只想收到自己定义的权限,则需要添加这个权限。相当于自己定义的内部广播
//)
registerReceiver(boradCast,intentFilter,BROADCAST_PERMISSION_DISC,null);
//注册一个广播,并且申明,这个广播需要BROADCAST_PERMISSION_DISC权限才能收到消息。但是我们应用程序已经注册了这个权限。所以是有这个权限的。
public class MyBoradCast extends BroadcastReceiver {
public static final String BROADCAST_PERMISSION_DISC = "com.cn.customview.permissions.MY_BROADCAST";
public static final String BROADCAST_ACTION_DISC = "com.cn.customview.permissions.my_action";
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
String tests = bundle.get("test");
Log.i("测试接收到广播:",tests);
}
}
注册一个广播,并且申明,这个广播需要BROADCAST_PERMISSION_DISC权限才能收到消息。但是我们应用程序已经注册了这个权限。所以是有这个权限的。
同时 在B 的manifest 中声明权限
<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
第三步 在A 中发送广播
Intent intent = new Intent();
// 广播action,只有和这个action 一样的接受者,才可以接收到广播
intent.setAction(BROADCAST_ACTION_DISC );
intent.putExtra("test","测试一下");
Log.i("发送广播","test");
//权限
sendBroadcast(intent,BROADCAST_PERMISSION_DISC);
sendBroadcast(int,permission)
第二个参数 代表接收消息的广播需要BROADCAST_PERMISSION_DISC权限。
注意:
1.registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null);如果改为registerReceiver(receiveBroadCast, filter); 照样能够收到第三步发送的消息,因为我们在xml里面已经申请了BROADCAST_PERMISSION_DISC权限,所以sendBroadcast(intent,BROADCAST_PERMISSION_DISC);发送广播我们依然能收到。
2.sendBroadcast(intent,BROADCAST_PERMISSION_DISC); 改为sendBroadcast(intent);也同样能收到这个消息。因为第一个的意思是收到这个消息的广播监听器必须有BROADCAST_PERMISSION_DISC权限,如果第二个参数去掉,则说明广播监听器不需要任何权限就能收到这个消息。
部分内容有粘贴大佬的,原文地址贴出
原文地址