Android 12 未决意图不可变标志在 API 23 下不可用
Android 12 Pending Intent Immutable flag not available under API 23
与此类似,但不相同
更新到 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)
以保留两个版本,我将继续使用关于未对 [=16= 使用正确标志的 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
)
}
您可以简单地忽略警告:在 APIs 级别低于 23 时,该标志将被简单地忽略(在 API 21 上测试)。
来自 PendingIntent.FLAG_MUTABLE
的文档:
Up until Build.VERSION_CODES.R, PendingIntents are assumed to be mutable by default, unless FLAG_IMMUTABLE is set. Starting with Build.VERSION_CODES.S, it will be required to explicitly specify the mutability of PendingIntents on creation with either FLAG_IMMUTABLE or FLAG_MUTABLE. It is strongly recommended to use FLAG_IMMUTABLE when creating a PendingIntent. FLAG_MUTABLE should only be used when some functionality relies on modifying the underlying intent, e.g. any PendingIntent that needs to be used with inline reply or bubbles.
总而言之,当目标 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
与此类似
更新到 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)
以保留两个版本,我将继续使用关于未对 [=16= 使用正确标志的 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
)
}
您可以简单地忽略警告:在 APIs 级别低于 23 时,该标志将被简单地忽略(在 API 21 上测试)。
来自 PendingIntent.FLAG_MUTABLE
的文档:
Up until Build.VERSION_CODES.R, PendingIntents are assumed to be mutable by default, unless FLAG_IMMUTABLE is set. Starting with Build.VERSION_CODES.S, it will be required to explicitly specify the mutability of PendingIntents on creation with either FLAG_IMMUTABLE or FLAG_MUTABLE. It is strongly recommended to use FLAG_IMMUTABLE when creating a PendingIntent. FLAG_MUTABLE should only be used when some functionality relies on modifying the underlying intent, e.g. any PendingIntent that needs to be used with inline reply or bubbles.
总而言之,当目标 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