PendingIntent.FLAG_IMMUTABLE 可以替换 PendingIntent.FLAG_UPDATE_CURRENT 吗?

Cod*_*Lee 6 android android-notifications android-pendingintent

我正在PendingIntent处理notification. 在我的项目中,我一直PendingIntent.FLAG_UPDATE_CURRENT在一些代码中使用。它的定义如下。

标志指示如果所描述的 PendingIntent 已经存在,则保留它,但用这个新 Intent 中的内容替换其额外数据。用于 getActivity(Context, int, Intent, int)、getBroadcast(Context, int, Intent, int) 和 getService(Context, int, Intent, int)。

如果您正在创建仅额外内容发生变化的意图,并且不关心接收到您之前的 PendingIntent 的任何实体将能够使用新的额外内容启动它,即使它们没有明确提供给它,则可以使用此方法。

即使设置了 FLAG_IMMUTABLE,FLAG_UPDATE_CURRENT 仍然有效 - PendingIntent 的创建者始终可以更新 PendingIntent 本身。IMMUTABLE 标志仅限制 send() 调用者更改 send() 发送的意图语义的能力。


但我必须选择FLAG_IMMUTABLE还是FLAG_MUTABLE因为Android12。就我而言,我不需要使用PendingIntent.FLAG_MUTABLE. 它的定义如下。

指示创建的 PendingIntent 应该是不可变的标志。这意味着传递给发送方法以填充此意图的未填充属性的附加意图参数将被忽略。

FLAG_IMMUTABLE 仅限制 send() 调用者更改 send() 发送的意图语义的能力。PendingIntent 的创建者始终可以通过 FLAG_UPDATE_CURRENT 更新 PendingIntent 本身。

正如你所看到的,他们说“即使设置了 FLAG_IMMUTABLE,FLAG_UPDATE_CURRENT 仍然有效...”和“PendingIntent 的创建者始终可以通过 FLAG_UPDATE_CURRENT 更新 PendingIntent 本身。”

那么,我想知道的是,它可以在任何Android版本中FLAG_IMMUTABLE完美替代吗?FLAG_UPDATE_CURRENT

例如

PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
=> PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_IMMUTABLE);
Run Code Online (Sandbox Code Playgroud)

ian*_*ake 11

FLAG_IMMUTABLE并控制其他应用程序FLAT_MUTABLE是否可以修改您的. 例如,如果您在通知中使用直接回复操作,系统将需要您使用它来填充用户键入的文本并将其发送给您。PendingIntentFLAT_MUTABLE

FLAG_UPDATE_CURRENT您的应用程序更新自己的PendingIntent. 这意味着,如果您创建相同的内容PendingIntent,唯一的区别是附加到您的附加内容IntentFLAG_UPDATE_CURRENT将确保您的新附加内容被实际使用(而不是仅再次使用原始集)。

因此,在您使用 的每种情况下FLAG_UPDATE_CURRENT,您都希望继续使用FLAG_UPDATE_CURRENT,并为您的情况添加正确的可变性标志(在 99% 的情况下,是FLAG_IMMUTABLE)。

要应用这两个标志,请使用Java 中的符号(或Kotlin 中的|单词):or

PendingIntent.getActivity(context, requestCode, intent,
    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
Run Code Online (Sandbox Code Playgroud)