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

Can*_*ato 11 android android-pendingintent android-12

与这个问题类似,但不一样

更新到 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)以保留两个版本,我会保留有关未使用正确标志的 lint 警告else

这里的预期行为是什么?谢谢!

Nin*_*ski 6

我刚刚遇到了同样的问题,这是我解决的方法:

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
   )
}
Run Code Online (Sandbox Code Playgroud)

  • 一个好的答案总是包含解释为什么这可以解决问题,以便OP和任何未来的读者可以从中学习。 (3认同)
  • 我真的不知道为什么,这只是 IDE 不会抱怨的一种说法 (2认同)

Noa*_*oah 1

来自以下文档PendingIntent.FLAG_MUTABLE

在 Build.VERSION_CODES.R 之前,默认情况下 PendingIntents 被假定为可变的,除非设置了 FLAG_IMMUTABLE。从 Build.VERSION_CODES.S 开始,需要在创建时使用 FLAG_IMMUTABLE 或 FLAG_MUTABLE 显式指定 PendingIntents 的可变性。强烈建议在创建 PendingIntent 时使用 FLAG_IMMUTABLE。仅当某些功能依赖于修改底层意图时才应使用 FLAG_MUTABLE,例如需要与内联回复或气泡一起使用的任何 PendingIntent。

总之,FLAG_IMMUTABLE当面向 API 31 或更高版本时,您应该将该标志添加到 PendingIntent 中,除非您需要 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
Run Code Online (Sandbox Code Playgroud)

您可以使用按位或运算将其与现有意图标志(如果有)结合起来。例如:

val flags = flag or PendingIntent.FLAG_ONE_SHOT
Run Code Online (Sandbox Code Playgroud)

  • `PendingIntent.FLAG_MUTABLE` 不适用于低于 31 的 API 级别。无法理解为什么这个答案会被接受。 (3认同)
  • val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else PendingIntent.FLAG_MUTABLE 此代码不会解决OP的问题,因为 PendingIntent.FLAG_MUTABLE 是在 api 级别 31 中首次引入的,因此它不能用于较低版本(在本例中为 <23 /Build.VERSION_CODES.M),正如 @Noah 在他的回答中提到的。Lint 会不断发出警告。 (2认同)