选择广播接收器是否应导出并可见 到设备上的其他应用程序。如果该接收器正在监听 从系统或其他应用程序(甚至其他应用程序)发送的广播 您拥有的 — 使用 RECEIVER_EXPORTED 标志。如果改为这个接收器 仅侦听您的应用程序发送的广播,请使用 RECEIVER_NOT_EXPORTED 标志。
这是google解释RECEIVER_EXPORTED、RECEIVER_NOT_EXPORTED
当我想使用系统发送的广播时 谷歌说我需要使用 RECEIVER_EXPORTED
但是当我使用“android.intent.action.AIRPLANE_MODE”和“RECEIVER_NOT_EXPORTED”进行测试时
我收到了广播事件。
谁能解释一下这句话吗?
我收到此错误:
必须是以下一项或多项:Context.RECEIVER_VISIBLE_TO_INSTANT_APPS、 android.content.Context.RECEIVER_EXPORTED, android.content.Context.RECEIVER_NOT_EXPORTED
即使我将其设置为
RECEIVER_NOT_EXPORTED
,如果将其设置为 RECEIVER_EXPORTED
,我也会收到相同的错误。就好像我对@RegisterReceiverFlags
界面不满意。
它最初建议将
RECEIVER_NOT_EXPORTED
作为首选,但当它显示此错误时,它建议我将其更改为 RECEIVER_VISIBLE_TO_INSTANT_APPS
。如果我将其设置为该值,它会消除错误,但随后将其突出显示为黄色,并建议我添加其他两个之一......如果我包含多个标志,这仍然会出错。
编辑:好吧,我通过使用
ContextCompat.registerReceiver()
而不是常规 registerReceiver()
来修复此问题,这也需要使用 ContextCompat.RECEIVER_NOT_EXPORTED
而不是 Context.RECEIVER_NOT_EXPORTED
。
他们的文档中可能有错误或者他们改变了主意,因为根据 ContextCompat 文档,您可以使用:
在我看来,这样更安全,因为我们不希望我们的接收器对所有应用程序开放只是为了获得系统广播。RECEIVER_NOT_EXPORTED 如果您只希望接收器能够从系统或您自己的应用程序接收广播。
(已编辑)我也在 RECEIVER_NOT_EXPORTED 文档中找到了这个与使用“exported=false”标记静态注册接收器具有相同的行为
接收器文档如果为“false”,广播接收器只能接收由系统、同一应用程序的组件或具有相同用户 ID 的应用程序发送的消息当我查看
所以我有足够的信心,实现是连贯的,并且文档中存在一个小错误