可以覆盖在清单中声明的​​BroadcastReceiver导出的attr的默认值

时间:2016-05-11 07:34:46

标签: android android-intent broadcastreceiver

如果在AndroidManifest.xml中声明了BroadcastReceiver,并指定了intent-filter,例如

<receiver
        android:name=".receiver.LocationProviderChangeReceiver"
        android:exported="false">
        <intent-filter>
            <action android:name="android.location.PROVIDERS_CHANGED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
</receiver>

根据http://developer.android.com/guide/topics/manifest/receiver-element.html#exported

  

默认值取决于广播接收器是否包含意图过滤器。缺少任何过滤器意味着只能由指定其确切类名的Intent对象调用它。这意味着接收器仅供应用程序内部使用(因为其他人通常不知道类名)。所以在这种情况下,默认值为&#34; false&#34;。另一方面,至少一个过滤器的存在意味着广播接收器旨在接收由系统或其他应用程序广播的意图,因此默认值为&#34; true&#34;。

我了解如果操作名称被定义为自定义过滤器的自定义名称,我们应将exported指定为false,因为默认情况下为true

但是在上面的例子中,动作名称表示它是从Android OS调用的,因此即使没有指定导出标志它也不会发出任何警告(默认情况下它是真的) )

在这种情况下将exported的值指定为false没有任何区别,应用仍会从操作系统获得广播。

根据文件:

  

广播接收器是否可以从其应用程序之外的来源接收消息 - &#34; true&#34;如果它可以,&#34;假&#34;如果不。如果&#34; false&#34;,广播接收者可以接收的唯一消息是由具有相同用户ID的相同应用程序的组件发送的消息。

我的假设是android系统发送的广播是应用程序之外的源。这里到底发生了什么?

  • 在这种情况下,exported的默认值是否未被显式指定的值覆盖?
  • 即使接收器未导出,应用程序是否仍会从Android系统获得广播? (并且仅限制其他应用程序发送广播)

1 个答案:

答案 0 :(得分:2)

android:exported属性用于指示/限制广播接收者的外部曝光。默认值android:exported不是true,也不是false这里的文档非常清楚。根据{{​​3}},默认值android:exported 取决于广播接收器是否包含意图过滤器。此外,如果没有过滤器,则值false是默认值。因此,尽管似乎没有意义,但我们的想法是,在设计时,您可以决定所需的行为(通过指定过滤器 - 或者如果不适用,明确将android:exported设置为false) 。当然,在指定过滤器时将android:exported设置为false是没有用的,因为指定至少一个过滤器意味着广播接收器旨在接收由系统或其他应用程序广播的意图。