【问题标题】:Android 12 Pending Intent Immutable flag not available under API 23Android 12 Pending Intent Immutable 标志在 API 23 下不可用
【发布时间】:2021-09-07 12:52:48
【问题描述】:

question类似,但不一样

更新到 Android 12 (SDK 31) 后,我们将 PendingIntent.getActivity(context, 0, intent, 0) 更改为 PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE),如 suggested

PendingIntent.FLAG_IMMUTABLE 不适用于 23 岁以下的 SDK。如果我添加 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 以保留两个版本,我将继续使用 lint 警告,即未对 else 案例使用正确的标志。

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

【问题讨论】:

  • 如果您有版本检查,那么您可以选择忽略 lint 警告或禁止它
  • @tyczj 确实如此,但我希望有正确的方法来做到这一点,而不是忽略/抑制。
  • 这是正确的做法,IDE不够聪明,无法知道你处理了这个场景

标签: android android-pendingintent android-12


【解决方案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。

总而言之,当面向 API 31 或更高版本时,您应该将 FLAG_IMMUTABLE 标志添加到您的 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

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

val flags = flag or PendingIntent.FLAG_ONE_SHOT

【讨论】:

  • val flag = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) PendingIntent.FLAG_IMMUTABLE else PendingIntent.FLAG_MUTABLE 此代码不会解决 OP 的问题,因为 PendingIntent.FLAG_MUTABLE 是在 api 中首次引入的31 级,因此它不能用于较低版本(在这种情况下为
【解决方案2】:

我也遇到了同样的问题,我是这样解决的:

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
   )
}

【讨论】:

  • 一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习。
  • 我真的不知道为什么 tbh,这只是 IDE 不会抱怨的一种方式
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2022-01-19
    相关资源
    最近更新 更多