与此问题类似,但不相同
更新到Android 12 (SDK 31)后,我们按照建议将PendingIntent.getActivity(context, 0, intent, 0)
更改为PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
。
但是PendingIntent.FLAG_IMMUTABLE
不能用于23以下的SDK。如果我添加if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
以保留两个版本,我将保留有关未为else
情况使用正确标志的lint警告。
这里的预期行为是什么?谢谢!
我刚刚遇到了同样的问题,这里是我如何修复它:
val flags =
if (SDK_INT >= Build.VERSION_CODES.S) {
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
} else {
PendingIntent.FLAG_UPDATE_CURRENT
}
return Intent(context, TastingReceiver::class.java).let { intent ->
intent.putExtra(EXTRA_TASTING_ID, tasting.id)
PendingIntent.getBroadcast(
context,
tasting.id.hashCode(),
intent,
flags
)
}
摘自PendingIntent.FLAG_MUTABLE
的文档:
直到Build.VERSION_CODES。R, pendingintent默认情况下是可变的,除非设置了FLAG_IMMUTABLE。从Build.VERSION_CODES开始。在创建pendingintent时,需要用FLAG_IMMUTABLE或FLAG_MUTABLE显式指定它的可变性。强烈建议在创建PendingIntent时使用FLAG_IMMUTABLE。FLAG_MUTABLE应该只在某些功能依赖于修改底层意图时使用,例如,任何PendingIntent都需要与内联回复或气泡一起使用。
总之,你应该在你的PendingIntent中添加FLAG_IMMUTABLE
标志,当你瞄准API 31或更高版本时,除非你需要你的PendingIntent是可变的,在这种情况下你需要使用FLAG_MUTABLE
。
因为FLAG_IMMUTABLE
是在API 23中引入的,所以您必须使用FLAG_MUTABLE
作为较低版本的后备。
val flag =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE
else PendingIntent.FLAG_MUTABLE
你可以使用位或操作将它与你现有的intent标志(如果你有的话)结合起来。例如:
val flags = flag or PendingIntent.FLAG_ONE_SHOT
你可以简单地忽略警告:在API级别低于23的情况下,该标志将被简单地忽略(在API 21上测试)。