0

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

4

2 回答 2

3

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

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

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

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

于 2015-07-28T13:45:03.127 回答
-1

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

希望它有效:)

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

于 2015-07-28T13:12:55.510 回答