如何在应用关闭后取消闹钟

时间:2015-07-28 13:03:35

标签: java android alarmmanager alarms

我使用AlarmManager对具有多个警报的应用程序进行了编程。我还有一种取消所有当前/未决警报的方法。它运行良好,但是如果用户从最近关闭应用程序(警报仍然是活动的,按预期),我的取消警报方法不再工作(应用程序崩溃)。这有什么解决方案吗?如何在用户关闭应用程序后取消警报?

这就是我的警报:

ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>();
AlarmManager am = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
...
Intent intent = new Intent(this, AlertReceiver.class);
Long cal = new GregorianCalendar().getTimeInMillis() + sms_in_x_minutes * 60 * 1000;
PendingIntent i1 = PendingIntent.getBroadcast(this, intent_id++, intent, 0);
am.set(AlarmManager.RTC_WAKEUP, cal, i1);
intentArray.add(i1);

这就是我的取消方法:

private void cancelAlarms(){
    if(intentArray.size()>0){
        for(int i=0; i<intentArray.size(); i++){
            am.cancel(intentArray.get(i));
        }
        intentArray.clear();
    }
}

我的猜测是关闭应用后intentArrayam为空,并且PendingIntents未保存。但我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:3)

不要保留一系列待定意图。正确诊断后,应用关闭后您的阵列为空,当您尝试再次访问时会导致崩溃。

仅设置最早的闹钟。将警报的ID保存到临时存储(例如SharedPreferences)。 (如果它更容易,您也可以使用ID的常量值,因为您现在只需要一个警报来考虑)

当您的警报触发时,您可以将下一个最早的警报设置为执行的第一个任务。

如果您要取消闹钟并在SharedPreferences中保存ID值,请使用此值重新创建AlarmManager并取消闹钟。如果没有ID值,则不设置警报,也不需要取消。

答案 1 :(得分:-1)

我认为您应该将关闭警报方法添加到应用程序的ondestroy方法中,因为如果用户关闭您的应用而不停止它们,则永远不会调用您的方法导致应用程序崩溃。

希望它有效:)

编辑:试着看看service和类似的。几个月前我确实在Android应用程序中使用它们,我记得即使我从最近关闭应用程序,此服务仍然有效,关闭它我必须在应用程序中添加方法或停止进程。 如果我知道这应该是你正在寻找的方法,对不起,如果我不准确,但几个月过去了,我忘了我使用的服务的名称,我只是确定这是一项服务:)