【问题标题】:How to sync AlarmManager with system time?如何将 AlarmManager 与系统时间同步?
【发布时间】:2013-09-03 14:57:50
【问题描述】:

我有一个问题,我使用 AlarManager 每分钟更新一个小部件(它是一个时钟)以显示当前时间,但是,AlarmManager 永远不会与设备中的系统时钟同步,我使用这个:

alarmManager.setRepeating(AlarmManager.RTC, System.getCurrentTimeInMillis(), 60000, pendingIntent);

它每分钟都有效,但是问题是,例如,如果我在下午 2:15:30 将小部件放在屏幕上,一分钟后,AlarmManager 将再次调用广播,所以下一次更新会在下午 2:16:30,并且不会与系统时间同步,因为当系统时间显示为下午 2:16:00 时,小部件仍会显示为下午 2:15:00。

希望我说的够清楚,感谢您的帮助,谢谢。

【问题讨论】:

    标签: android widget alarmmanager broadcast


    【解决方案1】:

    setRepeating 的第二个参数是您希望警报第一次触发的时间。您需要进行算术以将其与下一分钟边界对齐。例如:

     now = system.getCurrentTimeInMillis();
     oneMinuteFromNow = now  + oneMinute;
     nextMinuteRollover = oneMinuteFromNow - (oneMinuteFromNow % oneMinute);
    

    然后使用 nextMinuteRollover 作为 setRepeating 的第二个参数。

    (这显然可以简化——我把它写得很详细,这样你就可以看到代码在做什么。)

    【讨论】:

    • now = system.getCurrentTimeInMillis(); oneMinuteFromNow = now + 60000; nextMinuteRollover = oneMinuteFromNow - (oneMinuteFromNow % 60000); 我明白了,如果当前时间是下午 2:15:30,oneMinuteFromNow 将是相同的时间加上 1 分钟,所以是同样的问题,因为它会以非精确的分钟;我会试一试,但这是我最初的假设。谢谢!
    • 但是当你减去 oneMinuteFromNow mod oneMinute 时,它​​将 nextMinuteRollover 与时钟对齐。
    • 在您的示例中,从现在开始的一分钟将是 2:16:30。 oneMinuteFromNow mod oneMinute 将是 30 秒,因此 nextMinuteRollover 将是 2:16:00(准确)
    • 我会尽快试一试,让你知道我的结果,我希望它有效,我目前正在使用 AlarmManager 每秒更新一个小部件,但它消耗大量电池,我'希望准确地每分钟更新一次,谢谢!
    • 好的,我想我明白了,结果行如下:alarmManager.setRepeating(AlarmManager.RTC, nextMinuteRollover, 60000, test(context)); 例如,如果我有下午 3:30:15nextMinuteRollover 给我下午 3:31:00,那么我在下一分钟开始,然后我设置重复每 60000 毫秒。如果我使用NextMinuteRolloverAlarmManager 会每毫秒重复一次,形成下午 3:31:00,这不起作用。无论如何,你给了我 95% 的解决方案,非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多