问题描述与处理策略
1、问题描述
Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
- 在针对 Android S+ 开发应用程序时(即 Android 12,版本号 31 及以上),创建 PendingIntent 时必须指定
FLAG_IMMUTABLE
或FLAG_MUTABLE
之一,这是为了增强应用程序的安全性和稳定性
2、处理策略
// 假设原来是这样的
pendingIntent = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 需要修改成这样的
pendingIntent = PendingIntent.getActivity(context, requestCode, intent, PendingIntent.FLAG_IMMUTABLE);
补充
1、FLAG_IMMUTABLE
与 FLAG_MUTABLE
(1)FLAG_IMMUTABLE
-
FLAG_IMMUTABLE
表示创建的 PendingIntent 是不可变的 -
一旦 PendingIntent 被创建,它的内容(例如,Intent 中的数据)就不能被更改,这有助于防止潜在的安全漏洞(例如,在跨应用通信时)
-
在大多数情况下,如果 PendingIntent 不需要在创建后被修改,建议使用
FLAG_IMMUTABLE
(2)FLAG_MUTABLE
-
FLAG_MUTABLE
表示创建的 PendingIntent 是可变的 -
PendingIntent 的内容可以在创建后被更改
-
如果 PendingIntent 需要在创建后被修改(例如,用于通知的回复或气泡),那么应该使用
FLAG_MUTABLE
2、第三方库或 SDK的影响
-
如果应用的业务代码未使用 PendingIntent 还是出现了此问题,可能是使用了某些第三方库或 SDK,这些库或 SDK 在内部使用了 PendingIntent
-
当这些库或 SDK 没有针对 Android 12 及更高版本进行更新,以正确指定
FLAG_IMMUTABLE
或FLAG_MUTABLE
时,就会触发这个错误