选择是否应导出广播接收器并使其对设备上的其他应用可见。如果此接收器正在侦听从系统或其他应用(甚至是您拥有的其他应用)发送的广播,请使用RECEIVER_EXPORTED标志。如果此接收器仅侦听您的应用发送的广播,请使用RECEIVER_NOT_EXPORTED标志。
这是谷歌解释RECEIVER_EXPORTED,RECEIVER_NOT_EXPORTED
link to explanation
当我想使用从系统发送的广播谷歌说我需要使用RECEIVER_EXPORTED
但是当我用“android.intent.action.AIRPLANE_MODE”和“RECEIVER_NOT_EXPORTED”测试时,
我收到了广播事件。
有人能解释一下这句话吗?
3条答案
按热度按时间3phpmpom1#
我得到这个错误:
必须是以下一项或多项:Context.RECEIVER_VISIBLE_TO_EXPORANT_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
。如果我将其设置为RECEIVER_VISIBLE_TO_INSTANT_APPS
,它将删 debugging 误,但随后将其突出显示为黄色,并建议我添加其他两个中的一个.**编辑:**好的,我通过使用
ContextCompat.registerReceiver()
而不是常规的registerReceiver()
来修复这个问题,这也需要使用ContextCompat.RECEIVER_NOT_EXPORTED
而不是Context.RECEIVER_NOT_EXPORTED
。v09wglhw2#
他们的文档中可能有错误,或者他们改变了主意,因为根据ContextCompat文档,您可以用途:
RECEIVER_NOT_EXPORTED如果您只希望接收器能够接收来自系统或您自己的应用的广播。
在我看来,这样更安全,因为我们不想让我们的接收器对所有应用程序开放,只是为了获得系统广播。
我在RECEIVER_NOT_EXPORTED文档中也发现了这一点:
与用“exported=false”标记静态注册的接收器具有相同的行为
当我查看receiver documentation时,对于导出的属性,我读到:
如果为“false”,则广播接收器只能接收系统、同一应用程序的组件或具有相同用户ID的应用程序发送的消息
所以我有足够的信心实现是一致的,文档中有一个小错误
ttvkxqim3#
不幸的是,我也遇到过类似的情况。也许这是IDE的问题?我比较了以下编写方法,发现添加if语句块可以解决红色警告,尽管它总是' false '。
enter image description here