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