1

在我的主要活动中,我有一个方法 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(列表)中以显示数据。这是我在主类中的 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 和相同的附加功能来取消方法),但我的尝试被挫败了!我不知道把它放在哪里?以上所有内容都在同一类中。

无论用户删除一行还是全部,我认为最简单的方法是删除所有警报并再次循环通过该方法来重置它们。谁能帮忙告诉我把这个取消代码放在哪里?

4

1 回答 1

5

在长按列表

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

unique_id 对于每个待处理的意图都是独立的,因此获取 listview id ,添加 +1 以便它成为您的待处理意图 ID。

这样特定的 PendingIntent 将被删除。

取消所有警报 只需在设置警报和取消警报时创建一个 for 循环。

于 2012-06-12T14:43:27.340 回答