setPackage用于姜饼的意图

时间:2012-02-21 00:43:02

标签: android broadcastreceiver

根据android documentation

  

或者,从ICE_CREAM_SANDWICH开始,您还可以使用Intent.setPackage

安全地将广播限制为单个应用程序。

Gingerbread中是否有任何方法(可能使用兼容性库)限制sendBroadcat()事件,使其仅将其发送到指定的包?

3 个答案:

答案 0 :(得分:4)

我的第一个建议是尽可能使用LocalBroadcastManager。这使您可以完全忽略任何安全问题。

如果您确实需要将广播从一个应用程序发送到另一个应用程序,那么在ICS之前,registerReceiver()确实不遵守setPackage限制,因此在此之前您不能依赖它。没有任何秘密技巧可以做你想要的,只是平台没有它的设施。

那就是说......如果你要指定一个明确的包名,那为什么不一直走下去并使用Intent.setComponent()

还要记住,即使setPackage()或setComponent()也不会自动完全安全 - 您仍然假设您知道谁正在实现该软件包名称,并且完全有可能使用不同的应用程序而不是您希望通过侧载加载,即使您在Play商店中拥有该名称。

答案 1 :(得分:1)

文档说setPackage是在API Level 4中引入的,但也许有一个框架更改使其在ICS中的功能不同/更好。如何创建您的接收器可识别的自己的Intent Filterthis page底部附近的NotePad示例显示了一个示例:在清单中,NoteEditor示例指定

  

<action android:name="com.android.notepad.action.EDIT_NOTE" />

这是应用程序定义的自定义操作。

答案 2 :(得分:0)

由于广播是由系统处理的,我无法想象在没有触及系统代码的情况下,有任何方法可以在变通方法中进行编码(因此兼容性包不会有帮助)。

如果您真的对保持广播安全感兴趣,可以使用权限关注Android 4.0之前的Android文档建议:

  

要在发送时强制执行权限,请向sendBroadcast(Intent, String)sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle)提供非空权限参数。只有获得此权限的接收者(通过AndroidManifest.xml中的标签请求它)才能接收广播。