使用AlarmManager设置和取消警报(Android)

时间:2012-09-25 04:31:46

标签: android alarmmanager

这是一篇请求确认(或反驳)我认为在Android中发生警报的情况。这个主题在博客和StackOverflow帖子中频繁发生,但我没有找到这两点的明确解释(见下文)。

以下代码用于设置和警报,然后取消设置。它不起作用。

    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.setAction(AlarmReceiver.ALERT_GUARD_CHECKIN);
    PendingIntent sender = PendingIntent.getBroadcast(context, _id, intent,
            PendingIntent.FLAG_ONE_SHOT);

    AlarmManager am = (AlarmManager) context
            .getSystemService(Context.ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, now.getTime().getTime(), sender);

    Intent toCancel = new Intent(context, AlarmReceiver.class);
    toCancel.setAction(AlarmReceiver.ALERT_GUARD_CHECKIN);
    PendingIntent pendingToCancel = PendingIntent.getBroadcast(context,
            _id, toCancel, PendingIntent.FLAG_CANCEL_CURRENT);
    am.cancel(pendingToCancel);

如果不是将PendingIntent.FLAG_ONE_SHOT传递给PendingIntent.getBroadast()的第一次调用,而是传递零,那么它确实有效。我不相信这种行为是有记录的。

如果PendingIntent.getBroadast()(上面的,_id)的第二个参数不相同,则代码也不起作用。我不相信这是记录在案的。在Android文档中,第二个参数记录为“发件人的私有请求代码(当前未使用)。”

问题是我是否已正确描述了这种行为,或者这些概括是否属于虚拟现象。

2 个答案:

答案 0 :(得分:3)

您必须将PendingIntent传递给cancel(),这相当于您用来注册闹钟的那个。这意味着使用相同的Intent,标志和请求代码。与文档可能引导您相信的内容相反,它实际上也会检查请求代码值。

答案 1 :(得分:0)

您的Android Manifest中定义的闹钟是否有接收器?