什么是在BroadcastReceiver中使用android:exported="true"的作用?

66

我发现一些广播接收器在Android Manifest.xml中使用了android:exported="true"标签来进行注册。

<receiver android:exported="true" android:name="com.flyingsoftgames.googleplayquery.QueryReceiver">
    <intent-filter>
       <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>

android:exported="true"在Android中用于注册广播接收器,具体作用是什么?

2个回答

83

来自开发者指南:

android:exported 广播接收器是否可以接收来自其应用程序之外的消息——如果可以,则为“true”,否则为“false”。如果为“false”,则广播接收器只能接收由同一应用程序或具有相同用户ID的应用程序发送的消息。 默认值取决于广播接收器是否包含意图过滤器。缺少任何过滤器意味着它只能被指定其精确类名的Intent对象调用。这意味着该接收器仅用于应用程序内部使用(因为其他人通常不会知道类名)。所以在这种情况下,默认值为“false”。另一方面,至少有一个过滤器的存在意味着广播接收器旨在接收系统或其他应用程序广播的意图,因此默认值为“true”。

这个属性并不是限制广播接收器外部暴露的唯一方式。您还可以使用权限来限制可以向其发送消息的外部实体(请参见permission属性)。


嗨@Mou,如果没有声明android:exported,是否存在安全风险? - Renz Manacmol
1
这里所指的“用户ID”是什么意思:“广播接收器能够接收的唯一消息是由同一应用程序或具有相同用户ID的应用程序发送的消息”。 - Rishabh Dhiman
1
@RishabhDhiman 这里的“用户ID”大多指应用程序ID。 - Simran Sharma
3
如果相应组件有意图过滤器定义,则针对Android 12的应用程序必须声明android:exported 的明确值。否则,构建Android 12的应用将失败,并且会出现“Manifest merger failed”的错误提示。详情请参见https://developer.android.com/guide/topics/manifest/activity-element#exported。 - rosu alin

59

android:exported

true:广播接收器可以接收由同一或其他应用程序发送的事件

false:广播接收器只能接收由同一应用程序发送的事件


14
所以,如果我想要监听系统事件(例如蓝牙的开/关状态),我应该使用“exported=true”吗? - IgorGanapolsky
2
@IgorGanapolsky 在这种情况下,您不必使用此属性。 - CopsOnRoad
4
默认值取决于意图过滤器的存在与否。 - Shubham AgaRwal
@CopsOnRoad 对于穿戴设备通信也是一样吗?我应该将用于小部件和穿戴设备通信的应用广播接收器的exported属性设置为false吗? - Fakhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接