Android 12 Pending Intent Immutable标记在API 23下不可用 &



与此问题类似,但不相同

更新到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上测试)。

相关内容

  • 没有找到相关文章

最新更新