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
。
这里的预期行为是什么?谢谢!
我刚刚遇到了同样的问题,这是我解决的方法:
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)
来自以下文档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)
归档时间: |
|
查看次数: |
12563 次 |
最近记录: |