簡體   English   中英

Android SDK 33:如何取消使用 FLAG_UPDATE_CURRENT 創建的 AlarmManager 上的 PendingIntents

[英]Android SDK 33: How to cancel PendingIntents on the AlarmManager that were created using FLAG_UPDATE_CURRENT

在我們的應用程序中,用戶可以為不同的任務設置提醒。 在當前版本(使用 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_IMMUTABLE 或 FLAG_MUTABLE 之一。

解決方案似乎很簡單:我們只需將標志從FLAG_UPDATE_CURRENT更改為FLAG_IMMUTABLE即可修復錯誤。 但現在真正的問題出現了:通過調整 PendingIntent,我不再有可能刪除從以前版本更新的用戶的警報。 原因如下:

據我了解,從警報管理器中刪除項目的唯一方法是使用它的取消方法 不幸的是,取消方法要求我傳遞與創建通知完全相同的 PendingIntent。 例如,要從上面的示例中刪除通知,我需要調用:

PendingIntent notificationToDelete = PendingIntent.getBroadcast(context, notificationID, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
getAlarmManager().cancel(notificationToDelete);

不幸的是,這又回到了我們一開始面臨的錯誤。 但是如果我將取消方法中的標志更改為FLAG_IMMUTABLE ,則不會刪除舊通知,這完全有道理,因為我傳遞了一個不同的 PendingIntent (我也測試了幾次)。

當然,這對我們來說是一個非常嚴重的問題,因為如果用戶升級到新版本並刪除他們的任務,他們仍然會收到通知。

所以現在我處於這個非常令人沮喪的死胡同,想知道我是否是唯一受此問題影響的人。 我不是真正的 android 專家,也許我錯過了一個明顯的可能性。 有誰知道我可以通過其他方式從更新用戶中刪除“舊”通知的方法? 有沒有辦法只刪除所有當前警報而不需要先重新創建它們的意圖(例如使用 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
                )
            }

我們使用FLAG_UPDATE_CURRENT or FLAG_IMMUTABLE FLAG_UPDATE_CURRENT

感謝Saikrishna Rajaraman 的回答,幫助我們為大多數用戶找到了解決方案。 受剪報的啟發,我們編寫了一個 function 刪除所有更新用戶的所有“舊”意圖,為所有用戶傳遞“原始”標志仍然可能(SDK < 33):

int INTENT_FLAG = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU ? PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_UPDATE_CURRENT;
...
PendingIntent notificationToDelete = PendingIntent.getBroadcast(context, notificationID, notificationIntent, INTENT_FLAG);
getAlarmManager().cancel(notificationToDelete);

不幸的是,它僅適用於 SDK < 33 的用戶,因為對於 Android 13,意圖再次不匹配並導致原始錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM