在我们的应用程序中,用户可以为不同的任务设置提醒。在当前版本(使用SDK 30构建(中,通知基本上是通过以下方式创建的:
...
PendingIntent notification = PendingIntent.getBroadcast(context, notificationID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
getAlarmManager().setExact(AlarmManager.RTC_WAKEUP, fireDate, pendingIntent);
现在谷歌强迫我们升级到SDK 33,这就是我们所做的。不幸的是,在升级后,我们在调用上面的方法时遇到了以下错误:
瞄准S+(版本31及以上(需要在创建PendingIntent。
解决方案似乎很简单:我们只需将标志从FLAG_UPDATE_CURRENT
更改为FLAG_IMMUTABLE
即可修复错误。但现在真正的问题出现了:通过调整PendingIntent,我不再有可能删除从以前版本更新的用户的警报。原因如下:
据我所知,从警报管理器中删除项目的唯一方法是使用其取消方法。不幸的是,cancel方法要求我传递与创建Notification完全相同的PendingIntent。例如,要从上面的例子中删除通知,我需要调用:
PendingIntent notificationToDelete = PendingIntent.getBroadcast(context, notificationID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
getAlarmManager().cancel(notificationToDelete);
不幸的是,这又回到了我们一开始所面临的错误。但是,如果我将cancel方法中的标志更改为FLAG_IMMUTABLE
,则不会删除旧的通知,这完全有道理,因为我正在传递一个不同的PendingIntent(我也测试了它几次(。
当然,这对我们来说是一个非常严重的问题,因为如果用户升级到新版本并删除他们的任务,他们仍然会收到通知。
所以现在我正处于这个非常令人沮丧的死胡同,不知道我是否是唯一一个受到这个问题影响的人。我不是一个真正的机器人专家,也许我错过了一个明显的可能性。有人知道我可以删除";旧的";通过其他方式更新用户的通知?是否没有办法只删除所有当前警报而不需要首先重新创建其意图(例如使用NotificationManager(?我很感激你的任何暗示!
对于通知,我们执行了以下操作,
val pendingIntent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.getBroadcast(
context,
notificationId,
notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
} else {
PendingIntent.getBroadcast(
context,
notificationId,
notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
}
用CCD_ 5代替CCD_ 4。
感谢Saikrishna Rajaraman的回答,帮助我们为大多数用户找到了解决方案。受snipped的启发,我们编写了一个函数,删除所有";旧的";用于所有更新用户的意图;原始的";仍有可能的所有用户的标志(SDK<31(:
int INTENT_FLAG = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_UPDATE_CURRENT;
...
PendingIntent notificationToDelete = PendingIntent.getBroadcast(context, notificationID, notificationIntent, INTENT_FLAG);
getAlarmManager().cancel(notificationToDelete);
不幸的是,它只适用于使用SDK<31,因为对于Android 12和13,意图再次不匹配并导致原始错误。