17

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

@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()接受字符串权限的形式,然后在我的清单中定义该权限,给它一个高保护级别(例如签名)。那是对的吗?有没有更简单的方法?

4

2 回答 2

2

来自 BroadcastReceiver API 的 api 文档:

如果您不需要跨应用程序发送广播,请考虑将此类与LocalBroadcastManager一起使用,而不是下面描述的更通用的工具。这将为您提供更高效的实现(无需跨进程通信),并让您避免考虑与其他应用程序能够接收或发送广播相关的任何安全问题。

这样至少您可以将接收器仅保留在您的应用程序中。

于 2012-07-26T23:22:35.743 回答
2

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

似乎没有很多文档,但您可以通过运行发送自定义广播的单独应用程序来快速验证这一点。我在 API 16-29 上对此进行了测试,广播将被接收,因此每个包都可以发送到您的接收器(这可能是一个安全漏洞)。


要在不使用本地广播(应尽可能使用)的情况下解决问题,您在定义自定义权限并将广播限制为已请求该权限的应用程序方面处于正确的轨道。为了完整起见:

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

<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 );
于 2019-11-25T15:35:50.017 回答