【发布时间】:2014-02-23 00:48:02
【问题描述】:
我设法创建了一个通知服务,用于在警报时触发通知。不幸的是,使用 AlarmManager 设置警报无法正常工作。它会在几分钟后触发(不完全是几个小时,这表明存在时区问题)。循环周期为 1 周,因此我使用常量 INTERVAL_DAY 并将其乘以 7。为了确保一个 PendingIntent 不会替换另一个,我将 dayOfWeek 作为第二个参数传递给 PendingIntent.getService()。我通过记录来检查警报触发时间的正确性:
Log.d(TAG, "next alarm " + df.format(cal.getTime()));
真的没有办法列出所有设置的警报 - 至少是我自己的应用程序中的那些?我相信这是追踪错误的唯一方法。
我的代码:
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.DATE, 1);
cal.set(Calendar.HOUR_OF_DAY, hour);
cal.set(Calendar.MINUTE, minute);
Log.d(TAG, "next alarm " + df.format(cal.getTime()));
Intent showNotificationIntent = new Intent(context, NotificationService.class);
dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
alarmIntent = PendingIntent.getService(context, dayOfWeek, showNotificationIntent, 0);
getAlarmManager(context).setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
INTERVAL_WEEK, alarmIntent);
我想提供每天都有一个闹钟,但在不同的时间,可以由用户设置。所以我最多使用 7 个警报,它们应该每周触发一次。
即使阅读了许多类似问题的答案(我不打算创建重复的问题),我也没有设法找到问题。
【问题讨论】:
-
因为 setInexactRepeating。使用 setRepeating,itr 会在合适的时间被处理。
-
在当前版本中,setRepeating() 和 setInexactRepeating() 之间没有区别了。文档一直不鼓励使用 setRepeating()。在我的应用程序中这不是几秒钟,但警报应该在设定时间的一分钟内发出。
-
是的,不鼓励使用 setRepeating,因为它会在特定时间强制发出警报,无论哪种情况,您都需要时间精度。所以这里的子句不成立。
-
其实你是对的。 setRepeating() 工作正常。正如我所说,我曾预料到“不精确”意味着重复周期不精确,但第一个警报是。重复的警报不会按秒触发,而是在一分钟内触发。在空闲设备上它可以延迟几分钟,这让我很意外。
-
我同意你的看法 - 应该可以列出应用程序的所有预定警报。没有 API 真是太烦人了
标签: android alarmmanager repeatingalarm