Android中的广播可以跨进程甚至跨App直接通信,可能会收到其他app发送的相同的自定义广播,也可能被其他app收到并获取其中信息。一些增加安全性的方案包括:
1. 静态注册自定义广播时 android:exported="false" 属性设置false,不接收其他App内部发出的此广播
2. 发送自定义广播时,intent.setPackage(packageName)指定包名,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中
3. 采用LocalBroadcastManager的方式直接发送本地广播,
1.LocalBroadcast是APP内部维护的一套广播机制,有很高的安全性和高效性。
所以如果有APP内部发送、接收广播的需要应该使用LocalBroadcast。
2.Receiver只允许动态注册,不允许在Manifest中注册。
3.LocalBroadcastManager所发送的广播action,只能与注册到LocalBroadcastManager中BroadcastReceiver产生互动。
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction("xxx");
- localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取实例
- localBroadcastManager.registerReceiver(myBroadcastReceiver, intentFilter); //注册本地广播监听
-
- localBroadcastManager.sendBroadcast(new Intent("xxx")); // 发送本地广播
-
- localBroadcastManager.unregisterReceiver(myBroadcastReceiver);//退出时解除注册
注意:AndroidX废除了localBroadcastManager 直接使用Context的registerReceiver()、sendBroadcast()、unregisterReceiver() 进行注册、发送、解除
4. 在广播发送和接收时,都增加上permission,用于权限验证
4.1. 自己定义权限,并且使用自定义权限
- <permission
- android:name="my.permission.name"
- android:label="BroadcastReceiverPermission"
- android:protectionLevel="signature">
- permission>
- <uses-permission android:name="my.permission.name" />
android:protectionLevel属性如下:
4.2. 如果采用静态注册的方式:
- <receiver
- android:name=".common.MyBroadcastReceiver"
- android:exported="false"
- android:permission="my.permission.name">
- <intent-filter>
- <action android:name="action.name"/>
- intent-filter>
- receiver>
4.3. 如果采用动态注册的方式:
- //注册receiver时,指定发送者的权限,不然外部应用可以收到receiver
- registerReceiver(receiver, intentFilter, "my.permission.name", null);