一、问题起因
自 Android 14 (API 级别 34) 起,使用 context.registerReceiver(receiver, filter, flags) 动态注册广播接收器时,必须显式地声明 RECEIVER_NOT_EXPORTED 或 RECEIVER_EXPORTED 。
如果声明为 RECEIVER_EXPORTED ,任何第三方应用都能向你的应用发送不受保护的广播,有潜在的安全隐患。
上下文注册的接收器https://developer.android.com/develop/background-work/background-tasks/broadcasts?hl=zh-cn#context-registered-receivers 然而,当我根据文档内容将广播接收器声明为 RECEIVER_NOT_EXPORTED 时,发现这个接收器接收不到任何 Intent 。
二、问题原因
由于文档未提及广播的发送方法,因此我仍使用老方法:
val statisticsIntent = Intent("STATISTICS")
sendBroadcast(statisticsIntent)
经过搜索,我在安卓14行为变更文档中找到了原因:必须为 Intent 指定 package 。
对隐式 intent 和待处理 intent 的限制https://developer.android.com/about/versions/14/behavior-changes-14?hl=zh-cn#safer-intents
三、解决方法
val statisticsIntent = Intent("STATISTICS").apply { `package` = packageName
}
sendBroadcast(statisticsIntent)