簡體   English   中英

Android AlarmManager 未正確取消警報

[英]Android AlarmManager not cancelling alarms correctly

我正在開發一個允許用戶設置多個通知並取消他們選擇的任何通知的應用程序。

我遇到的問題是,當我使用 AlarmManager 取消掛起的意圖時,它正在取消所有警報。 我的每個待處理意圖都有自己獨特的請求代碼。

例如,我會調用它來創建警報,然后刪除:

setAlarm(5062, 1453269670) // Set alarm 1
setAlarm(5063, 1453774418) // Set alarm 2

cancelAlarm(5062) // Cancel alarm 1
cancelAlarm(5063) // Cancel alarm 2

設置多個警報總是有效的,我可以設置任意數量的警報,它們都會產生通知。 但是,如果我要取消警報 1,它也會取消警報 2。

我知道設置和取消時掛起的意圖必須相同,並且每個掛起的意圖都有自己唯一的請求代碼,所以我不知道為什么它不起作用。 我花了很多時間在谷歌上搜索,但沒有一個建議的答案對我有幫助。

void setAlarm(int request_code, long alarm_time) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    intent.putExtra("request_code", request_code);
    PendingIntent pendingIntent = PendingIntent.getService(context, request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarm_time, pendingIntent);
}

void cancelAlarm(int request_code) {
    Intent intent = new Intent(context, NotificationReceiver.class);
    intent.putExtra("request_code", request_code);
    PendingIntent pendingIntent = PendingIntent.getService(context, request_code, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    pendingIntent.cancel();
    alarmManager.cancel(pendingIntent);
}

答案很簡單

Intent firstIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra1");
firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0);

Intent secondIntent = new Intent(this, Receiver.class);
intent.setAction("action 2");
intent.putExtra("extra", "extra2");
secondPendingIntent = PendingIntent.getBroadcast(this, 0, secondIntent, 0);

如果您比較在上述代碼中創建的兩個 PendingIntent,它們不等於

但在下面的代碼中:

Intent firstIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra1");
firstPendingIntent = PendingIntent.getBroadcast(this, 0, firstIntent, 0);
Intent secondIntent = new Intent(this, Receiver.class);
intent.setAction("action 1");
intent.putExtra("extra", "extra2");
secondPendingIntent = PendingIntent.getBroadcast(this, 0, secondIntent, 0);

如果您比較兩個 PendingIntent,它們將是 EQUAL 的,因此您在 putExtra 方法中傳遞的內容並不重要

暫無
暫無

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

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