我无法在Android中取消Alarms / PendingIntents

时间:2012-06-12 14:30:50

标签: android alarmmanager android-pendingintent

在我的主要活动中,我有一个方法setRepeatingAlarm()来在应用程序首次加载时设置警报。该方法通过循环遍历列并从SQLite表中的每一行获取整数值来成功设置警报。以下是基本方法:

 for (int i : AlarmDays) {


        Calendar cal = Calendar.getInstance();
        if (cal.get(Calendar.MINUTE) >= i)
            cal.add(Calendar.HOUR, 1);
        cal.set(Calendar.MINUTE, i);

        Intent intent = new Intent(ManageDebts.this, TimeAlarm.class);
        pendingIntent = PendingIntent.getBroadcast(this, i,
                intent, PendingIntent.FLAG_CANCEL_CURRENT);
        am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                60 * 60 * 1000, pendingIntent);
    }

方法完成后,再次循环遍历行,并将每个行放入CustomAdapter(List)以显示数据。以下是我在主类中的onCreate中的上下文(同样是基本的):

    datasource = new DebtDataSource(this);
    datasource.open();

    **am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    setRepeatingAlarm();**

    values = datasource.getAllDebt();
    adapter = new MyArrayAdapter(this, values);
    setListAdapter(adapter);

我希望用户长按一行并删除该项,或者有一个删除所有行的按钮。一切正常,但我不能让警报消失。

我明白如何做到这一点(通过设置相同的pendingIntent取消方法与相同的额外内容),但我的尝试被挫败了!我不知道把它放在哪里?以上所有内容都在相同类中。

用户是删除一行还是全部,我认为简单的方法是删除所有警报并再次循环该方法以重置它们。任何人都可以帮忙,并告诉我在哪里放置这个取消代码?

1 个答案:

答案 0 :(得分:5)

长按列表

PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0);
am.cancel(pi);

unique_id对于每个待处理的意图都是单独的,因此请获取listview ID,添加+1以使其成为您的待处理意图ID。

这样就可以删除特定的PendingIntent。

取消所有闹钟只需在设置闹钟和取消闹钟时进行for循环。