Android 8.0的平台上,应用不能对大部分的广播进行静态注册

引言
在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,由于有些广播仍是可以注册的。好比,通过测试,对接收Android 开机的广播经过静态注册仍是可以正常接收的。
 android

解决办法
咱们知道广播的注册方式分为两种:app

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

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

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

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

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

1 <uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
2 
3 <permission
4 android:name="com.cn.customview.permissions.MY_BROADCAST"
5 android:protectionLevel="signature" >
6 </permission> 

 

注意:android:protectionLevel=”signature” 若是是同一个应用能够这么声明,若是跨app发送广播(好比A app向B app发送广播),则须要去掉android:protectionLevel=”signature”。code

关于protectionLevel,你们能够参考下面博客:
https://blog.csdn.net/u013553529/article/details/53167072xml

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

 1 private static final String BROADCAST_PERMISSION_DISC = "com.cn.customview.permissions.MY_BROADCAST";
 2 private static final String BROADCAST_ACTION_DISC = "com.cn.customview.permissions.my_broadcast";
 3 
 4 @Override
 5 protected void onCreate(Bundle savedInstanceState) {
 6 super.onCreate(savedInstanceState);
 7 setContentView(R.layout.broadcast_permissions_activity);
 8 ButterKnife.bind(this);
 9 // 注册广播接收
10 BroadcastReceiver receiveBroadCast = new ReceiveBroadCast();
11 IntentFilter filter = new IntentFilter();
12 filter.addAction(BROADCAST_ACTION_DISC); // 只有持有相同的action的接受者才能接收此广播
13 registerReceiver(receiveBroadCast, filter,BROADCAST_PERMISSION_DISC,null);
14 }
15 
16 public class ReceiveBroadCast extends BroadcastReceiver {
17 
18 @Override
19 public void onReceive(Context context, Intent intent) {
20 Toast.makeText(BroadcastPermissionsActivity.this,
21 "receive broadcast", 0).show();
22 }
23 
24 } 

 

注册一个广播,而且申明,这个广播须要BROADCAST_PERMISSION_DISC权限才能收到消息。可是咱们应用程序已经注册了这个权限。因此是有这个权限的。

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

<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />

 

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

1 public void sendBroadcastWithPermissions() {
2 Intent intent = new Intent(); //Itent就是咱们要发送的内容
3 intent.putExtra("data", "this is data from broadcast "+Calendar.getInstance().get(Calendar.SECOND));
4 intent.setAction(BROADCAST_ACTION_DISC); //设置你这个广播的action,只有和这个action同样的接受者才能接受者才能接收广播
5 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权限,若是第二个参数去掉,则说明广播监听器不须要任何权限就能收到这个消息。

相关文章
相关标签/搜索