Android广播sendBroadcast(intent,receiverPermission)解析

来源:互联网 发布:mac snow ball peach 编辑:程序博客网 时间:2024/05/21 00:55
       偶然看到发送广播的一个方法里带着多个参数,而大部分网上教程讲解的都是只带一个参数(intent)的sendBroadcase( ),所以决定对这个带多个参数的方法研究一下,过程甚是艰辛。

       第二个参数从名字上来看,似乎是某个权限。关于自定义权限的问题,请看我另一篇博文Android自定义权限怎样设置。

       先从最简单的开始入手。

        1、AndroidManifest.xml中Receiver下的android:permission标签有什么用?网上绝大部分的解释是,对发送者设置的权限,也就是发送者必须拥有这个权限,发出的广播,Receiver才会处理。

       2、sendBroadcast(intent,receiverPermission)中第二个参数有什么作用?依旧根据网上的解释,是对接收者Receiver做的权限设置,也就是Receiver必须拥有这个权限,才能处理它发出的广播。

       姑且认为以上两种说法都是对的。现在做一个试验。创建一个工程,在AndroidManifest.xml中加入如下片段,自定义并使用一个权限:

<permission android:name="com.wild.wildwithflower.myper"/>    <uses-permission android:name="com.wild.wildwithflower.myper"/>

Receiver如下配置:

<receiver android:name="com.wild.wildwithflower.WildReceiver"             android:permission="com.wild.wildwithflower.myper"            >            <intent-filter android:priority="30">                <action android:name="guangbo"/>            </intent-filter></receiver>
在Activity中用一个按钮触发,发送广播,如下:

 sendBroadCastButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//sendOrderedBroadcast(new Intent("guangbo"),android.Manifest.permission.BLUETOOTH);sendBroadcast(new Intent("guangbo"), Manifest.permission.myper);}});

也就是 发送者Activity说,要有myper权限的Receiver才能接收我发出的广播,而Receiver则说,要有myper权限的发送者发出的广播我才会处理,很显然,他们两个都有这个权限,所以广播最终会顺利执行。试验结果,跟网上的说法无冲突。

下面稍作改动 。AndroidManifest.xml中多自定义一个权限son,但并不使用它:

<permission android:name="com.wild.wildwithflower.myper"/>    <uses-permission android:name="com.wild.wildwithflower.myper"/>    <permission android:name="com.wild.wildwithflower.son"/>

Receiver中也稍作改动:

<receiver android:name="com.wild.wildwithflower.WildReceiver"             <span style="background-color: rgb(204, 204, 204);"><span style="color:#ff0000;">android:permission="com.wild.wildwithflower.son"</span></span>            >            <intent-filter android:priority="30">                <action android:name="guangbo"/>            </intent-filter>        </receiver>

发送广播的代码不变动。即,Receiver说,有son权限的发送者发出的广播,我才会处理。而发送者Activity和Receiver本身都是没有son权限的。试着运行下,发现广播仍然成功处理了。这是怎么回事?跟网上的说法冲突了。先不管这个问题,继续往下探索。

再创建一个工程,并在这个新工程的AndroidManifest.xml中:

<uses-permission android:name="com.wild.wildwithflower.myper"/>
即,获取myper这个权限。

旧工程的Receiver改回myper权限:

<receiver android:name="com.wild.wildwithflower.WildReceiver"             android:permission="com.wild.wildwithflower.myper"            >            <intent-filter android:priority="30">                <action android:name="guangbo"/>            </intent-filter></receiver>

接下来,在这个新工程的Activity中依旧用按钮触发:

sendBroadcast(new Intent("guangbo"), Manifest.permission.myper);
也就是,旧工程的Receiver说,要有myper权限的发送者发出的广播我才处理,新工程说,要有myper权限的Receiver才能接收我的广播。运行发现,广播顺利完成。与网上说法无冲突。

继续。

旧工程的Receiver再改回son权限:

<receiver android:name="com.wild.wildwithflower.WildReceiver"             android:permission="com.wild.wildwithflower.son"            >            <intent-filter android:priority="30">                <action android:name="guangbo"/>            </intent-filter>        </receiver>
也就是,Receiver说,要有son权限的发送者发出的广播我才处理,而新工程的发送者Activity没有这个son权限。试着再用新工程发送广播,发现,广播并没有被处理。

于是,现在的情况是:

Receiver说要有son权限的发送者发送的广播我才会处理,跟Receiver同工程的Activity即使没有son权限依然能发出广播,Receiver也会处理它的广播,但是在另一个工程中,没有son权限的Activity发出的广播却不能被Receiver处理。

这是什么原因????

个人猜测,如果这不是android的一个bug,一个可能的原因就是,android认为,跟我在同一个应用中的组件都是朋友,不会伤害我,所以即使我朋友没有这个权限,它派来的任务我也会执行,但是另一个工程就不知道是敌是友了,它必须有这个权限(这在一定程度上说明它取得了通行证),我才会信任它。




       

0 0
原创粉丝点击