在我的主要活动中,我有一个方法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取消方法与相同的额外内容),但我的尝试被挫败了!我不知道把它放在哪里?以上所有内容都在相同类中。
用户是删除一行还是全部,我认为简单的方法是删除所有警报并再次循环该方法以重置它们。任何人都可以帮忙,并告诉我在哪里放置这个取消代码?
答案 0 :(得分:5)
长按列表
PendingIntent pi = PendingIntent.getBroadcast(context, unique_id, i, 0);
am.cancel(pi);
unique_id对于每个待处理的意图都是单独的,因此请获取listview ID,添加+1以使其成为您的待处理意图ID。
这样就可以删除特定的PendingIntent。
取消所有闹钟只需在设置闹钟和取消闹钟时进行for循环。