避免其他Android应用程序收听我的广播?

时间:2014-03-26 12:02:46

标签: android android-intent broadcastreceiver intentfilter android-permissions

嗯......我不知道尝试这样做是否对Android架构有意义,或者甚至可能。

我接受第三方应用程序通过带有自定义intent-filter的BroadcastReceiver来调用我的应用程序。所以,我要求第三方应用程序通过sendBroadcast向我发送包名称,以便能够通过sendBroadcast向我发送关于委托给我的工作状态的回调。

现在,我想创建自己的第三方应用程序,它连接到我的核心应用程序,我担心会发送一些特殊的回调,只能由我的第三方应用程序捕获。

所以,如果"未经授权的"第三方监听我发送的意图过滤器将捕获我的广播。

目前,当我收到我自己的第三方广播时,我会检查包裹名称并检查是否安装了此包裹以试图避免将未经授权的假冒伪劣识别为我自己的第三方。但是,如果用户安装了我的第三方并且未经授权,那么这将保护"会失败。

我读了一些关于设置自定义权限的内容,但我不知道是否适合我的方案。

你能给我一些建议吗?

非常感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用安全级别为“签名”的自定义权限,则只有使用相同密钥签名的应用才能向您的接收方发送广播。 如果这解决了你的问题,那你就没事了。

http://developer.android.com/guide/topics/manifest/permission-element.html#plevel

  

“签名” - 系统仅在以下情况下授予的权限   请求申请的签名与证书相同   声明权限的应用程序。如果证书匹配,   系统会在不通知的情况下自动授予权限   用户或要求用户明确批准。

答案 1 :(得分:1)

PendingIntent有一个有趣的属性:它不仅捆绑了Intent以及要对其执行的操作,而且还有效地捆绑了执行该操作的安全上下文。

换句话说,它可用于允许外部进程与您的某个组件通信,即使该组件未导出也是如此。

我们在PendingIntent的标准用途中看到了很多,例如AlarmManagerNotification。我们通常在Intent内使用明确的PendingIntent(例如new Intent(this, MyOtherComponent.class))。通常这些组件没有<intent-filter>或者在我们的清单中导出。然而,他们工作。这是因为虽然管理警报和/或通知的操作系统进程无法正常与我们的组件通信,但它可以执行PendingIntentPendingIntent是我们说“是的,你可以和这个组件交谈,但只针对这个PendingIntent所做的事情,而不是任意的事情。“

因此,如果一个应用程序想要与另一个应用程序建立回调机制,那么光滑的方法是使用PendingIntent。第一个应用的组件(例如,BroadcastReceiver)不必导出,更不用说有<intent-filter>。然而,第二个应用程序可以通过PendingIntent触发该组件。由于PendingIntentParcelable,因此可以在其他Intent上轻松打包,通过AIDL定义的接口传递绑定服务,或者以其他方式遍历流程边界。