3

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

更新到 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案例使用正确的标志。

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

4

3 回答 3

2

从以下文档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

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

val flags = flag or PendingIntent.FLAG_ONE_SHOT
于 2022-01-07T21:11:09.490 回答
1

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

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
   )
}
于 2021-12-15T16:16:01.870 回答
-1

您可以简单地忽略警告:在低于 23 的 API 级别上,该标志将被简单地忽略(在 API 21 上测试)。

于 2021-12-25T09:14:05.277 回答