• 面试:Android广播相关


    广播的安全性

    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产生互动。

    1. IntentFilter intentFilter = new IntentFilter();
    2. intentFilter.addAction("xxx");
    3. localBroadcastManager = LocalBroadcastManager.getInstance(this); //获取实例
    4. localBroadcastManager.registerReceiver(myBroadcastReceiver, intentFilter); //注册本地广播监听
    5. localBroadcastManager.sendBroadcast(new Intent("xxx")); // 发送本地广播
    6. localBroadcastManager.unregisterReceiver(myBroadcastReceiver);//退出时解除注册

    注意:AndroidX废除了localBroadcastManager 直接使用Context的registerReceiver()、sendBroadcast()、unregisterReceiver() 进行注册、发送、解除

    4. 在广播发送和接收时,都增加上permission,用于权限验证

    4.1. 自己定义权限,并且使用自定义权限

    1. <permission
    2. android:name="my.permission.name"
    3. android:label="BroadcastReceiverPermission"
    4. android:protectionLevel="signature">
    5. permission>
    6. <uses-permission android:name="my.permission.name" />

    android:protectionLevel属性如下:

    • normal:默认的,应用安装前,用户可以看到相应的权限,但无需用户主动授权。
    • dangerous:normal安全级别控制以外的任何危险操作。需要dangerous级别权限时,Android会明确要求用户进行授权。常见的如:网络使用权限,相机使用权限及联系人信息使用权限等。
    • signature:它要求权限声明应用和权限使用应用使用相同的keystore进行签名。如果使用同一keystore,则该权限由系统授予,否则系统会拒绝。并且权限授予时,不会通知用户。它常用于应用内部。把protectionLevel声明为signature。如果别的应用使用的不是同一个签名文件,就没办法使用该权限,从而保护了自己的接收者。

    4.2. 如果采用静态注册的方式:

    1. <receiver
    2. android:name=".common.MyBroadcastReceiver"
    3. android:exported="false"
    4. android:permission="my.permission.name">
    5. <intent-filter>
    6. <action android:name="action.name"/>
    7. intent-filter>
    8. receiver>

    4.3. 如果采用动态注册的方式:

    1. //注册receiver时,指定发送者的权限,不然外部应用可以收到receiver
    2. registerReceiver(receiver, intentFilter, "my.permission.name", null);

    Android学习小记----监听电量的变化(不能静态注册的广播)

  • 相关阅读:
    Linux入门之使用紧急救援模式更改 root 密码
    华为OD机试2024(JS,C++,JAVA,PYTHON)-字符串摘要
    MySQL数据库
    基于SpringBoot的停车位智能管理系统的设计与实现_kaic
    【postgresql 基础入门】创建数据库的方法,存储位置,决定自己的数据的访问用户和范围
    npm安装依赖报错npm ERR! code ENOTFOUNDnpm ERR! syscall getaddrinfo
    快速使用 MyBatis-Plus
    JAVA学习第2步——项目创建和导包
    lenovo联想笔记本ThinkPad P16V Gen 1(21FC,21FD)原装出厂Win11系统
    Android-Framework 不允许应用商场下载的应用安装,adb 、pm 可以正常安装
  • 原文地址:https://blog.csdn.net/cpcpcp123/article/details/127665446