我有一个允许用户选择分钟池的应用程序。因此,他们可能会选择 5、15、30 和 50 分钟。然后,使用以下代码同时为每个警报设置一个警报管理器警报(此代码块效果很好):
//SET ALL ALARMS
for(int i = 0; i < spAlarms.length; i++) {
try {
if(!spAlarms[i].equals("")) {
int time = Integer.valueOf(spAlarms[i]);
final int intent_id = (int) System.currentTimeMillis();
/*
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MINUTE, time);
*/
Intent intent = new Intent(Hop_Timer.this, Alarm_Receiver.class);
intent.putExtra("alarm_message", "Time for your " + spAlarms[i] + " min addition!");
intent_ids += "intent_id;";
PendingIntent sender = PendingIntent.getBroadcast(Hop_Timer.this, intent_id, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager am = (AlarmManager) Hop_Timer.this.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (time*1000), sender);
//Toast.makeText(getApplicationContext(), "Set alarm" + String.valueOf(System.currentTimeMillis() + (time*1000)), Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
//ALARMS SET
我希望用户能够清除所有警报并重新开始,即使在设置它们并点击开始之后也是如此。我正在尝试 AlarmManager.cancel 类,但它不起作用。文档说,如果意图与用于设置警报的意图相同,那么它将取消它。所以,我使用这段代码来取消它:
String[] spCANCELS = intent_ids.split(";");
//Cancel all previous set alarms
for(int i = 0; i < spCANCELS.length; i++) {
try {
if(!spCANCELS[i].equals("")) {
int time = Integer.valueOf(spCANCELS[i]);
Intent intent = new Intent(Hop_Timer.this, Alarm_Receiver.class);
intent.putExtra("alarm_message", "Time for your " + spCANCELS[i] + " min addition!");
PendingIntent sender = PendingIntent.getBroadcast(Hop_Timer.this, time, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager am = (AlarmManager) Hop_Timer.this.getSystemService(Context.ALARM_SERVICE);
am.cancel(sender);
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
//All clear!
唉,警报不断响起。我通过在 5 秒内放置 10 个不同的警报来进行测试。我让前 3 或 4 个警报响起,然后点击我的取消按钮,但警报不断出现(虽然所有字段都清除在点击内,所以我知道点击监听器正在工作)。
编辑:没关系,我在查看语法时需要更加注意。这一行:intent_ids += "intent_id;"; 不应该在引号中包含变量 intent_id。