【发布时间】:2012-02-21 00:43:01
【问题描述】:
或者,从 ICE_CREAM_SANDWICH 开始,您还可以使用 Intent.setPackage 安全地将广播限制为单个应用程序
Gingerbread 中是否有任何方法(可能使用兼容性库)来限制 sendBroadcat() 事件,使其仅将其发送到指定的包?
【问题讨论】:
或者,从 ICE_CREAM_SANDWICH 开始,您还可以使用 Intent.setPackage 安全地将广播限制为单个应用程序
Gingerbread 中是否有任何方法(可能使用兼容性库)来限制 sendBroadcat() 事件,使其仅将其发送到指定的包?
【问题讨论】:
我的第一个建议是尽可能使用LocalBroadcastManager。这使您可以完全忽略任何安全问题。
如果您确实需要将广播从一个应用程序发送到另一个应用程序,那么在 ICS 之前 registerReceiver() 确实不遵守 setPackage 限制,因此在此之前您不能依赖它。做你想做的事没有秘诀,只是平台没有相应的功能。
也就是说...如果您要指定明确的包名称,为什么不直接使用Intent.setComponent()?
另外请记住,即使 setPackage() 或 setComponent() 也不是自动完全安全的——您仍然假设您知道谁在实现该包名称,并且完全有可能与其他应用程序不同即使您在 Play 商店中拥有该名称,您也希望通过侧面加载进行安装。
【讨论】:
文档说setPackage 是在 API 级别 4 中引入的,但可能存在框架更改,使其在 ICS 中的功能不同/更好。如何创建自己的Intent Filter 让您的接收者能够识别? this page 底部附近的记事本示例显示了一个示例:在清单中,NoteEditor 示例指定
<action android:name="com.android.notepad.action.EDIT_NOTE" />
这是应用定义的自定义操作。
【讨论】:
由于广播是由系统处理的,我无法想象有任何方法可以在不触及系统代码的情况下在变通方案中进行编码(因此兼容性包无济于事)。
如果您真的对保证广播的安全感兴趣,可以使用权限遵循 Android 文档对 pre-Android 4.0 的建议:
要在发送时强制执行权限,请向
sendBroadcast(Intent, String)或sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)提供非空权限参数。只有被授予此权限的接收者(通过在其 AndroidManifest.xml 中使用标签请求)才能接收广播。
【讨论】: