android 8.0跨App(进程)发送广播

引言

在 Android 8.0 的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在 AndroidManifest 文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的。比如,经过测试,对接收 Android 开机的广播通过静态注册还是能够正常接收的。
Android 8.0 行为变更的介绍链接:developer.android.com/about/versi…,前面那个链接必须通过 FQ,当然我们提倡科学上网,所以国内镜像网站链接:developer.android.google.cn/about/versi…

解决办法

我们知道广播的注册方式分为两种:

  1. 静态注册,也就是说在 AndroidManifest 文件中对 BroadcastReceiver 进行注册,通常还会加上 action 用来过滤。

  2. 动态注册,调用 Context 中的 registerReceiver 对广播进行动态注册,使用 unRegisterReceiver 方法对广播进行取消注册的操作。

既然 android 8.0 已经限制了静态注册,我们就不必在静态注册上面费工夫了(除非你想折腾下)。

这里假设有两个 app A 和 B,其中 A 为发送广播的 app,B 为接收广播的 app

第一步:在 A app 中定义权限,并且使用自定义权限

<uses-permission android: />

<permission
   android:
   android:protectionLevel="signature" >
</permission>
复制代码

注意:android:protectionLevel=”signature” 如果是同一个应用可以这么声明,如果跨 app 发送广播(比如 A app 向 B app 发送广播),则需要去掉 android:protectionLevel=”signature”。

关于 protectionLevel,大家可以参考下面博客:
blog.csdn.net/u013553529/…

第二步:在 B app 中定义注册广播

    private static final String BROADCAST_PERMISSION_DISC = "com.cn.customview.permissions.MY_BROADCAST";
    private static final String BROADCAST_ACTION_DISC = "com.cn.customview.permissions.my_broadcast";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.broadcast_permissions_activity);
        ButterKnife.bind(this);
        // 注册广播接收
        BroadcastReceiver receiveBroadCast = new ReceiveBroadCast();
        IntentFilter filter = new IntentFilter();
        filter.addAction(BROADCAST_ACTION_DISC); // 只有持有相同的action的接受者才能接收此广播
        registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null);
    }

public class ReceiveBroadCast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(BroadcastPermissionsActivity.this,
                "receive broadcast", 0).show();
    }

}
复制代码

注册一个广播,并且申明,这个广播需要 BROADCAST_PERMISSION_DISC 权限才能收到消息。但是我们应用程序已经注册了这个权限。所以是有这个权限的。

同时在 B app 的 AndroidManifest 中声明权限:

<uses-permission android: />
复制代码

第三步: 在 A app 中发送广播

public void sendBroadcastWithPermissions() {
   Intent intent = new Intent();  //Itent就是我们要发送的内容
   intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND));
   intent.setAction(BROADCAST_ACTION_DISC);   //设置你这个广播的action,只有和这个action一样的接受者才能接受者才能接收广播
   sendBroadcast(intent,BROADCAST_PERMISSION_DISC);   //发送广播
}
复制代码

代表接收消息的广播需要 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 权限,如果第二个参数去掉,则说明广播监听器不需要任何权限就能收到这个消息。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享