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


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

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

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

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

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

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

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

    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”。

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

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

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

     
     

  • 相关阅读:
    【WCSF】DynamicMethod 的类型所有者无效解决方案
    关于微软企业库查询语句db.ExecuteNonQuery(cmd)返回1的问题
    ASP.NET 如何取得 Request URL 的各個部分
    CSS模拟HTML滚动条
    JavaScript Madness不同的浏览器的keycode比较
    手机身份证IP地址开放接口
    sql添加数据后返回受影响行数据
    jquery下removeClass(“oldClassName”).addClass("newClassName")的问题
    躺着看书!这是所谓 "躺着就能长智慧" 吗?
    在web开发中使用dynsrc被McAfee报木马病毒的解决
  • 原文地址:https://www.cnblogs.com/endv/p/11695262.html
Copyright © 2020-2023  润新知