1

首先,这个网站很棒,每个人都很乐于助人。这是我的第一篇文章,如果我遗漏了什么,请原谅我。

我像这样创建一个警报:

private void startLocation() {

    AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    Intent i = new Intent(context, MyWeatherUpdateService.class);
    PendingIntent service = PendingIntent.getService(context, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);

    alarm.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime() + (60 * 1000),
            Long.parseLong(prefs.getString("listpref", "60000")), service);

}

在片段内部调用的这个方法中,上下文来自getApplication(),listpref是一个字符串更新间隔,以毫秒为单位。

我通过以下方式取消它:

public void endLocation() {

    Intent i = new Intent(context, MyWeatherUpdateService.class);
    PendingIntent service = PendingIntent.getService(context, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);
    alarm.cancel(service);

}

确保意图/待定意图是相同的。

现在我有两个问题:

1)警报几乎在创建后立即触发,即使我告诉它在 1 分钟后开始。2)当我调用取消时,警报会在取消警报之前再次触发。

问题1)为什么警报会这么快响起?并且使用 2) 这是按预期工作还是应该像我想要的那样立即取消警报。

如果我没有提供足够的信息,如果需要,我会添加更多代码。

提前致谢。

4

1 回答 1

1

警报几乎在创建后立即触发,即使我告诉它在 1 分钟后开始

那是因为您使用RTC的是elapsedRealtime()开始时间。那些需要匹配。最简单的解决方案是切换到ELAPSED_REALTIME.

当我调用取消时,警报会在取消警报之前再次触发。

尝试用 替换PendingIntent.FLAG_CANCEL_CURRENT0至少在PendingIntent您的cancel()通话中。

于 2013-05-27T20:38:11.390 回答