一、广播接收者定义的权限

你的应用定义了一个广播接收者,你不希望谁都能在自己的应用里发送这个广播让你接收到,所以你打算定义一个权限来控制一下。

1.在 AndroidManifest.xml 文件里声明一个新的权限

<permission android:name="com.xxx.xxx.permission" />

2.在声明的广播上加上这个权限

<receiver android:name=".broadcast.MyBroadcast"
            android:permission="com.xxx.xxx.permission">
            <intent-filter>
                <action android:name="com.xxx.mybroadcast.action" />
            </intent-filter>
        </receiver>

好了,这样就设置好了这个广播接收者的权限,别的应用想发送这个广播,就需要在他的应用的 AndroidManifest.xml 里添加权限来标识他想要使用这个权限。自己的应用里发送这个广播是不需要添加权限的。

3.三方应用添加发广播的权限

<uses-permission android:name="com.xxx.xxx.permission" />

好了,这样就可以发送 com.xxx.mybroadcast.action 对应的广播了,如果不加这个权限,就算发了这个广播,对应的广播接收者也是收不到的。

二、广播发送者定义的权限

你是发送广播的人,你希望谁都能在自己的应用里定义对应的 action 来接收你发的广播,所以你打算定义一个权限来控制一下。
1.在 AndroidManifest.xml 文件里声明一个新的权限
<permission android:name="com.xxx.xxx.permission.haha" />

2.发送广播时带上这个权限
sendBroadcast(new Intent("com.xxx.mybroadcast.action"), "com.xxx.xxx.permission.haha");

3.三方应用添加收广播的权限
<uses-permission android:name="com.xxx.xxx.permission.haha" /> 好了,这样就可以接收到 com.xxx.mybroadcast.action对应的广播了,如果不加这个权限,就算发了这个广播,对应的广播接收者也是收不到的。

4.注意事项
你们有了一个新的业务需求,你们项目组的应用到时需要向公司另一个项目组 B 的应用发广播,你们已经开发好了,就剩下设置权限测试一下就发版本了,这时 B 组的兄弟告诉你,他们应用的这个广播接收者,到时权限会定义为 com.x.permission2,但是一时半会上不了线,你们先发版本吧,权限就写这个准没事儿,不要等我们了。
他的广播接收者设置好权限为 com.x.permission2,你直接写好这个权限先发版本,看着像是等他们的应用上线后,你们的应用就能正常发广播给他们了,实际上不行,这里有个先后顺序,需要让定义权限的应用先安装,发送广播的应用后安装,流程才能正常。

如果你想同时定义收发两种权限,这样会发生什么?
假设应用 A 发送广播,应用 B 接收广播,先让接收者 B 定义(permission)一个权限,那么 A 想发这个广播就得在清单文件声明要使用这个权限(uses-permission),这时需要先安装应用 B,后安装应用 A 才行;(接收者:你想发这个广播让我收到,你要声明使用我定义的这个权限,不然我不收) 如果广播发送者同时也想定义一个权限,那么得让发送者 A 定义(permission)一个权限,B 想接收广播就得在清单文件声明要使用这个权限(uses-permission),这时需要先安装应用 A,后安装应用 B 才行。(发送者:你想收到我发的这个广播,你要声明使用我定义的这个权限,不然你收不到) 情况1:先安装 B,后安装 A,接收者定义的权限正常生效,A 发送不带权限的广播,B 能收到,但是发送带权限的就收不到,因为发送者 A 定义的权限后安装;
情况2:先安装 A,后安装 B,发送者定义的权限正常生效,但是无论发送的广播带不带权限,B 都收不到,因为接收者 B
定义的权限后安装,发送者 A 根本就没有效声明过想使用这个权限,就算你发不带权限的广播,人家都不收你的,你还发个带权限的广播,想 peach…

谁定义权限,谁先安装。