PendingIntent设置FLAG_IMMUTABLE时传入参数为空是什么原因?
关于Android 12+ PendingIntent可变性标记的常见问题解答
什么场景下不能使用FLAG_IMMUTABLE
FLAG_IMMUTABLE的核心作用是声明PendingIntent创建后,其内部包裹的Intent内容不允许任何修改,包括当前应用自身和其他第三方应用的修改操作,以下场景必须使用FLAG_MUTABLE,禁止使用FLAG_IMMUTABLE:
- 需要通过
PendingIntent.send()方法传入额外Intent进行参数合并的场景,就是你当前回传参数的用法,不可变PendingIntent会直接忽略传入的合并Intent内容,导致额外参数为null - 需要使用
Intent.fillIn()方法延迟补全Intent参数的场景,参数补全操作依赖PendingIntent的可修改权限,不可变标记会直接让补全操作失效 - 需要让系统或可信第三方应用往PendingIntent中写入参数的场景,比如通知栏快捷回复、桌面快捷方式参数传递、系统权限申请结果回传等,不可变标记会导致系统写入的参数被丢弃,功能异常
正确使用提示
- 无动态修改PendingIntent需求的场景优先使用
FLAG_IMMUTABLE,该标记可以避免恶意应用篡改PendingIntent执行未授权操作,符合系统安全设计要求 - 必须使用
FLAG_MUTABLE的场景,建议给PendingIntent包裹的Intent设置明确的组件名(ComponentName),限制Intent只能跳转至自身应用的组件,避免被恶意应用诱导跳转或拦截 - 不要将携带
FLAG_MUTABLE标记的PendingIntent传递给不可信的第三方应用,防止参数被篡改
你遇到的问题原因说明
- 使用
FLAG_IMMUTABLE时PendingIntent参数为null:因为你后续存在修改PendingIntent内容的操作,被不可变标记拦截,修改的内容未生效,替换为FLAG_MUTABLE后修改操作正常执行,参数可以正常读取 - 回传参数
additional_extra为null:不可变PendingIntent会无视send()方法传入的合并Intent,你添加的额外参数没有被写入最终触发的Intent中,改为FLAG_MUTABLE后即可正常获取
示例代码
兼容多版本的可变PendingIntent声明
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12及以上必须明确指定可变性标记 PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_MUTABLE } else { // 低版本系统无强制可变性要求,直接使用原有标记即可 PendingIntent.FLAG_ONE_SHOT } val pendingIntent = PendingIntent.getService(activity, 0, myServiceRequestIntent, flags)
动态追加参数发送
val fillInIntent = Intent().apply { putExtra("additional_extra", "test") } // 仅可变PendingIntent会合并fillInIntent的参数到最终触发的Intent中 pendingIntent?.send(this, 0, fillInIntent)
内容的提问来源于stack exchange,提问作者user3728425
相关产品推荐
相关产品推荐

