Android:是非导出的广播接收器吗?

时间:2012-07-26 17:59:16

标签: android

如果我在我的活动中注册广播接收器,请

@Override
protected void onResume() {
    super.onResume();

    myReceiver = new BroadcastReceiver() { ... };
    IntentFilter filter = new IntentFilter("com.example.MY_ACTION");
    registerReceiver(myReceiver, filter);
}

此接收器是否已导出?如果另一个应用广播com.example.MY_ACTION,它是否会被myReceiver收到?

如果是,我假设我需要使用接受字符串权限的registerReceiver()形式,然后在我的清单中定义该权限,为其提供高保护级别(例如签名)。那是对的吗?有更简单的方法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

来自BroadcastReceiver API上的api文档:

  

如果您不需要跨应用程序发送广播,请考虑   使用此类与LocalBroadcastManager而不是更多   一般设施如下所述。这会给你更多   有效的实施(不需要跨进程通信)和   允许您避免考虑与其他相关的任何安全问题   应用程序能够接收或发送您的广播。

至少你可以将接收器保留在你的应用程序中。

答案 1 :(得分:0)

为了节省其他工作并出于我自己的存档目的:是的,默认情况下会导出上下文注册的接收器

似乎documentation并不多,但是您可以通过运行一个单独的发送自定义广播的应用来快速验证这一点。我在API 16-29上对此进行了测试,可以接收广播,因此每个包都可以发送到您的接收者(这可能是安全缺陷)。


要在不使用本地广播(should be used wherever possible)的情况下解决问题,则可以正确定义自定义权限和restricting broadcasts to apps that have requested that permission。 为了完整起见:

在清单中定义并使用自定义权限:

<permission android:name="com.example.bcrtest.BROADCAST_PERMISSION"
    android:protectionLevel="signature"/>
<uses-permission android:name="com.example.bcrtest.BROADCAST_PERMISSION" />

注册接收者的权限:

registerReceiver(mReceiver, new IntentFilter(MY_INTENT_ACTION), "com.example.bcrtest.BROADCAST_PERMISSION", null );