安卓:上下文注册的广播接收器是否被导出?
-
12-12-2019 - |
题
如果我在我的活动中注册一个广播接收器,如下所示,
@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()
接受字符串权限,然后在我的清单中定义该权限,为其提供高保护级别(例如签名)。那是对的吗?有没有更简单的方法?
谢谢。
解决方案
来自 BroadcastReceiver API 的 api 文档:
如果您不需要跨应用程序发送广播,请考虑使用此类 本地广播管理器 而不是下面描述的更一般的设施。这将为您提供更有效的实施(无需交叉处理通信),并允许您避免考虑与其他能够接收或发送广播相关的安全问题。
这样至少您可以将接收器仅保留在您的应用程序中。
其他提示
为了减轻其他人的工作并为了我自己的存档目的:是的,上下文注册的接收器 是 默认导出。
好像没有太多 文档 但您可以通过运行发送自定义广播的单独应用程序来快速验证这一点。我在 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 );
不隶属于 StackOverflow