0

我已经制作了一个警报管理器来安排一些用户定义的事件并且它工作成功然后我制作了一个设置屏幕(来自首选项活动)让用户更改一些设置,例如(警报前几天)

我的问题是如果我在活动开始日期之前安排活动 3 天,那么用户将前几天从设置更改为仅一天

然后我在活动开始日期前 1 天再次安排活动,这意味着用户将收到两次通知

  • 3天前的一个
  • 1天前

如果这是真的,那么我该如何防止这种情况发生

提前致谢

4

2 回答 2

2

每个警报都伴随着一个 PendingIntent,它具有唯一的哈希标识符。当使用相同的标识符时,该警报将覆盖前者,如文档中所述:http: //developer.android.com/reference/android/app/AlarmManager.html#set (int , long, android.app.PendingIntent)

安排闹钟。注意:...如果已经为同一个 IntentSender 安排了警报,它将首先被取消...

请注意,PendingIntent 的特征在于它们的参数和标识符。

Intent intent = new Intent(mContext, YourTarget.class);
// The hashcode works as an identifier here. By using the same, the alarm will be overwrriten
PendingIntent sender = PendingIntent.getBroadcast(mContext, hashCode, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
    mAlarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
} else {
    mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
}
于 2013-03-24T09:37:47.533 回答
1
public void cancel (PendingIntent operation)

Remove any alarms with a matching Intent. Any alarm, of any type, whose Intent 

匹配这个(由 filterEquals(Intent) 定义),将被取消。

因此,您可以在待处理的意图上调用取消alarmManager.cancel(myPendingIntent) 并创建一个具有新时间的新意图。

但是您不必显式调用取消,因为只要 filterEquals 在将您的新 PendingIntent 与前一个比较时返回 true,那么您的警报将仅在 1 天前开始。

public boolean filterEquals (Intent other)

Determine if two intents are the same for the purposes of intent resolution 

(过滤)。也就是说,如果它们的动作、数据、类型、类和类别相同。这不会比较意图中包含的任何额外数据。

于 2013-03-24T09:51:23.530 回答