【问题标题】:How to cancel alarms after app was closed应用关闭后如何取消闹钟
【发布时间】:2015-07-28 13:03:35
【问题描述】:

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

【问题讨论】:

  • 你试过 Android Life Cycle,你应该可以取消警报 onDestroy 但是我不确定在内存不足的情况下如何工作。
  • 是的,正如 Pier 建议的那样,我将不得不使用 onDestroy ,这很好。它将防止我所有的崩溃。理想情况下,我希望在关闭并启动应用程序后取消所有活动警报。也许那是不可能的。还是非常感谢!
  • 一个应用永远不需要设置多个闹钟。只需要最早的。当那个触发时,您的应用程序可以将下一个最早设置为它执行的第一个任务。这使得跟踪警报变得更加简单。这也使得重启后再次设置它们变得更容易,因为警报不会在重启后继续存在。
  • 谢谢库夫斯!我绝对可以做到这一点,一个警报可能更聪明:) 但即使我只使用一个(最早的)警报。有没有办法(假设我不使用 OnDestroy)在应用程序关闭并重新打开后取消该警报?
  • 看我的回答。下面。

标签: java android alarmmanager alarms


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢!!创建另一个具有相同 ID 的警报并取消它是我一直在寻找的想法。我也会听从您的建议,一次只有 1 个活动警报。它会让我的代码更简单!
  • 这是一个常见的场景(设置多个警报),但从逻辑上讲,最早的第二个不能在最早的之前触发,因此在最早的一个已经触发之前不需要。
  • 报警ID在哪里?
  • 上题代码中,命名为intent_id
  • 所以我可以使用这个意图对象删除(取消)PendingIntent i1 = PendingIntent.getBroadcast(this, &lt;MY_SPECIFIC_ID&gt;, intent, 0); 的特定警报?
【解决方案2】:

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

希望它有效:)

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

【讨论】:

  • 好主意,我会这样做的。它绝对可以防止所有的崩溃。这不是我一直在寻找的答案,因为我想在再次启动应用程序后取消所有警报。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多