Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在应用程序关闭后取消警报_Java_Android_Alarmmanager_Alarms - Fatal编程技术网

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

Java 如何在应用程序关闭后取消警报,java,android,alarmmanager,alarms,Java,Android,Alarmmanager,Alarms,我使用AlarmManager编程了一个包含多个警报的应用程序。我还有一种方法可以取消所有当前/挂起的报警。它工作得很好,但是如果用户最近关闭了应用程序(警报仍处于活动状态,正如预期的那样),我的取消警报方法将不再工作(应用程序崩溃)。有什么解决办法吗?用户关闭应用程序后,我如何取消警报 这就是我的闹钟的样子: ArrayList<PendingIntent> intentArray = new ArrayList<PendingIntent>(); AlarmManag

我使用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);
ArrayList intentArray=new ArrayList();
AlarmManager am=(AlarmManager)this.getSystemService(Context.ALARM\u服务);
...
意向意向=新意向(此,AlertReceiver.class);
Long cal=新的GregorianCalendar().getTimeInMillis()+sms_in_x_minutes*60*1000;
PendingEvent i1=PendingEvent.getBroadcast(this,intent_id++,intent,0);
am.set(AlarmManager.RTC_唤醒,校准,i1);
加入(i1);
这是我的cancel方法的外观:

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

对于(int i=0;i我认为您应该将关闭报警方法添加到应用程序的ondestroy方法中,因为如果用户在不停止的情况下关闭应用程序,您的方法将永远不会被调用,从而导致应用程序崩溃

希望它能起作用:)

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

不要保留一个挂起意图的数组。正如您正确诊断的,您的数组在应用程序关闭后是空的,这会在您尝试访问时导致崩溃再给他们一次机会

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

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


如果您想取消报警并在
共享参考文件中保存ID值,请使用此选项重新创建
报警管理器
并取消报警。如果没有ID值,则不会设置报警,也不需要取消报警。

您试过Android吗,您应该能够取消报警
onDestroy
>然而,我不确定在内存不足的情况下该如何工作。是的,正如Pier建议的那样,我将不得不使用onDestroy,这很好。它将防止我的所有崩溃。理想情况下,我希望在关闭并启动应用程序后取消所有活动警报。也许这是不可能的。无论如何,非常感谢!一个应用程序不需要设置多个警报p、 只需要最早的警报。当一个警报启动时,你的应用程序可以设置下一个最早的警报作为它执行的第一个任务。这使得跟踪你的警报变得更加简单。这也使得在重新启动后重新设置警报更加容易,因为警报在重新启动后无法存活。谢谢Kuffs!我完全可以这样做,一个警报可能非常重要聪明的:)但即使我只使用一个(最早的)闹钟。有没有办法(假设我不使用OnDestroy)要在应用程序关闭并重新打开后取消警报?请参阅我的答案。下面。Mh好主意,我会这样做。这绝对可以防止所有崩溃。这不是我想要的答案,因为我想在再次启动应用程序后取消所有警报。但是谢谢!非常感谢!!创建另一个具有相同ID的警报,并且可以这是我一直在寻找的想法。我也会按照你的建议一次只激活一个警报。这将使我的代码更简单!这是一个常见的场景(设置多个警报)但从逻辑上讲,第二个最早的警报永远不会在最早的警报之前触发,因此在最早的警报已经触发之前不需要。警报的ID在哪里?在上述问题的代码中,它被命名为intent_idSo,因此我可以通过
pendingent i1=pendingent.getBroadcast(this,intent,0)删除(取消)特定的警报;
,是否使用此目标对象?