【安卓】BroadcastReceiver 动态声明为 RECEIVER_NOT_EXPORTED 后无法接收任何 Intent 的问题

【安卓】BroadcastReceiver 动态声明为 RECEIVER_NOT_EXPORTED 后无法接收任何 Intent 的问题_第1张图片

一、问题起因

        自 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)

你可能感兴趣的:(踩坑&避坑,问题解决,android,kotlin)