Android 14系统广播接收器导出规则例外误解致崩溃,求正确解读
Android 14广播接收器注册问题解答
你对文档的核心误解
你把「系统定义的广播」和「仅系统能发送的广播」混为一谈了:
- 文档里的例外规则,只适用于只有系统组件才有权限发送的广播,不是所有系统SDK里定义的广播都符合条件。
ACTION_DOWNLOAD_COMPLETE虽然是系统SDK定义的、列在broadcast_actions.txt里的广播,但它并非只能由系统发送——任何应用都可以调用DownloadManager发起下载触发这个广播,甚至恶意应用能构造该广播发送。所以它不在例外范围内。
例外规则的正确解读
Android 14要求上下文注册的接收器必须指定导出标志,例外仅针对完全由系统发起、外部应用无法模拟或发送的广播,比如:
ACTION_BOOT_COMPLETED(系统启动完成)ACTION_TIME_CHANGED(系统时间变更)
这类广播只有系统能发,不存在外部伪造的风险,所以才不需要指定导出标志。
代码修正方案
对于ACTION_DOWNLOAD_COMPLETE这类广播,必须明确指定导出标志。如果你的接收器只需要接收本应用发起的下载完成广播,应该设置为不导出,避免其他应用的广播干扰:
if (getActivity() != null) { IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); // 设置不导出标志,仅接收本应用或系统发送的广播 getActivity().registerReceiver(onDownloadComplete, filter, Context.RECEIVER_NOT_EXPORTED); }
如果确实需要接收其他应用发起的该广播(这种场景非常少见),可以使用Context.RECEIVER_EXPORTED,但要注意防范恶意广播的安全风险。
内容的提问来源于stack exchange,提问作者Adam Burley
相关产品推荐
相关产品推荐

