如何在应用程序关闭后取消警报

How to cancel alarms after app was closed

我使用 AlarmManager 编写了一个带有多个闹钟的应用程序。我还有一种方法可以取消所有 current/pending 警报。它运行良好,但是如果用户从最近关闭应用程序(警报仍然有效,如预期的那样),我的取消警报方法不再起作用(应用程序崩溃)。有什么解决办法吗?如何在用户关闭应用程序后取消闹钟?

我的闹钟是这样的:

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没有保存。但我不知道如何解决这个问题。

我认为你应该在你的应用的ondestroy方法中添加关闭报警方法,因为如果用户在没有停止他们的情况下关闭你的应用,你的方法将永远不会被调用导致应用崩溃。

希望它有用:)

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

不要保留待定意向数组。正如您正确诊断的那样,您的数组在应用程序关闭后为空,这会在您尝试再次访问它们时导致崩溃。

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

当您的闹钟响起时,您可以将下一个最早的闹钟设置为第一个执行的任务。

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