25

我有一个alarmManager我用来在特定时间向用户发送通知的。由于有多个警报,我有多个待定意图,我正在创建并提供唯一 ID,但是在某些情况下,我需要获取所有待定意图然后取消它们,以便我可以重置警报。我已经尝试过这样做,但我似乎仍然无法正确处理,所以我有几个问题:

这是您正确获取和取消 a 的方式PendingIntent吗?

Intent intent = new Intent(con, AppointmentNotificationReciever.class);
PendingIntent sender = PendingIntent.getBroadcast(con, id, intent,
        PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);
am.cancel(sender);

意图是否需要与原始待定意图(附加和全部)完全匹配?

PendingIntent标志是否需要与原始待处理意图的标志相匹配?

4

2 回答 2

60

我发现您实际上并没有“获取”待处理的意图……您必须完全按照您第一次创建它时的状态重新创建它(也包括意图),然后将其传递给 AlarmManager 的取消函数。所以我发布的上面的代码真的不是不正确的,只要我第一次创建它就是这样。希望有人会觉得这很有帮助。

于 2010-12-03T21:47:34.037 回答
1

我有一个创建和取消警报的测试实现示例。

    public void setTHEalarm(Calendar aCalendarToAlarm) {
    int id;
    Intent intent;
    PendingIntent pendingIntent;
    AlarmManager alarmManager;

    //I create an unique ID for my Pending Intent based on fire time of my alarm:

    id = Integer.parseInt(String.format("%s%s%s%s",

            aCalendarToAlarm.get(Calendar.HOUR_OF_DAY),
            aCalendarToAlarm.get(Calendar.MINUTE),
            aCalendarToAlarm.get(Calendar.SECOND),
            aCalendarToAlarm.get(Calendar.MILLISECOND))); //HASH for ID

    intent = new Intent(this,AlarmReceiver.class);
    intent.putExtra("id",id); //Use the id on my intent, It would be usefull later.

    //Put the id on my Pending Intent:
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,0);
    alarmManager = (AlarmManager)

            this.getSystemService(Context.ALARM_SERVICE);


    alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,aCalendarToAlarm.getTimeInMillis(),CustomDate.INTERVAL_MINUTE,pendingIntent);


    Log.w(TAG+" Torrancio","Created alarm id: "
            +id+" -> "
            +CustomDate.dateToHumanString(aCalendarToAlarm.getTime()));

    //Keep a reference in a previously declared field of My Activity (...)
    this.idSaved = id;

}

//Now for canceling
public void setCancel() {
    int id;
    Intent intent;
    PendingIntent pendingIntent;
    AlarmManager alarmManager;

    id = this.idSaved;
    intent =  new Intent(this,AlarmReceiver.class);
    intent.putExtra("id",id);
    pendingIntent = PendingIntent.getBroadcast(this,id,intent,PendingIntent.FLAG_CANCEL_CURRENT);

    //Note I used FLAG_CANCEL_CURRENT 

    alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(pendingIntent);

    Log.w(TAG+" Torrancio","Canceled->"+id);


}

需要3样东西,

  • 相同类型的意图(在这种情况下,我们谈论的是AlarmManager)。
  • 相同的 PendingIntent ID(保留 id 的引用,以某种方式保存)。
  • 一个正确的标志(FLAG_CANCEL_CURRENT用于取消,不需要也不能完全是您在创建挂起意图时使用的标志 [因为我们使用取消标志进行 calcel,但不创建。 ])

有关更多详细信息,请查看内容。

希望能帮助到你。

于 2016-08-19T16:06:14.457 回答