如何在应用程序关闭后取消警报
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();
}
}
我的猜测是intentArray
和am
在我关闭应用程序后是空的,PendingIntents
没有保存。但我不知道如何解决这个问题。
我认为你应该在你的应用的ondestroy方法中添加关闭报警方法,因为如果用户在没有停止他们的情况下关闭你的应用,你的方法将永远不会被调用导致应用崩溃。
希望它有用:)
编辑:尝试查看 service 和类似内容。几个月前,我确实在一个 android 应用程序中使用了它们,我记得即使我从最近关闭该应用程序,该服务仍然有效,为了关闭它,我必须在应用程序中添加一个方法或停止该过程。
如果我明白了,这应该是您正在寻找的方法,对不起,如果我不准确,但几个月过去了,我忘记了我使用的服务的名称,我只是确定它是一项服务:)
不要保留待定意向数组。正如您正确诊断的那样,您的数组在应用程序关闭后为空,这会在您尝试再次访问它们时导致崩溃。
只设置最早的闹钟。将警报 ID 保存到临时存储器(例如 SharedPreferences
)。 (如果更简单,您也可以为 ID 使用常量值,因为您现在只需要考虑一个警报)
当您的闹钟响起时,您可以将下一个最早的闹钟设置为第一个执行的任务。
如果您想取消闹钟并将 ID 值保存在 SharedPreferences
中,请使用它来重新创建 AlarmManager
并取消闹钟。如果没有 ID 值,则不会设置警报,也不需要取消。
我使用 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();
}
}
我的猜测是intentArray
和am
在我关闭应用程序后是空的,PendingIntents
没有保存。但我不知道如何解决这个问题。
我认为你应该在你的应用的ondestroy方法中添加关闭报警方法,因为如果用户在没有停止他们的情况下关闭你的应用,你的方法将永远不会被调用导致应用崩溃。
希望它有用:)
编辑:尝试查看 service 和类似内容。几个月前,我确实在一个 android 应用程序中使用了它们,我记得即使我从最近关闭该应用程序,该服务仍然有效,为了关闭它,我必须在应用程序中添加一个方法或停止该过程。 如果我明白了,这应该是您正在寻找的方法,对不起,如果我不准确,但几个月过去了,我忘记了我使用的服务的名称,我只是确定它是一项服务:)
不要保留待定意向数组。正如您正确诊断的那样,您的数组在应用程序关闭后为空,这会在您尝试再次访问它们时导致崩溃。
只设置最早的闹钟。将警报 ID 保存到临时存储器(例如 SharedPreferences
)。 (如果更简单,您也可以为 ID 使用常量值,因为您现在只需要考虑一个警报)
当您的闹钟响起时,您可以将下一个最早的闹钟设置为第一个执行的任务。
如果您想取消闹钟并将 ID 值保存在 SharedPreferences
中,请使用它来重新创建 AlarmManager
并取消闹钟。如果没有 ID 值,则不会设置警报,也不需要取消。