我需要每天在给定的时间设置闹钟。我正在使用AlarmManager.RTC_WAKEUP
对闹钟进行编程,因此它使用系统时间作为参考。我将警报设置为首先在所需的小时执行,然后每天重复:
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
getTimestampToday("12:00"),
AlarmManager.INTERVAL_DAY,
pendingIntent
);
getTimestampToday
方法在所需的小时返回今天的长时间戳。它通过获取今天的本地日期,然后设置所需的小时,最后将其转换回时间戳(基于UTC)来实现。
这里的问题是警报应该按照当地时间运作。因此,如果在安排警报后更改时间(例如,DST时间更改,或者用户前往其他国家/地区,或者他手动更改日期,时间或时区),则警报将在错误的当地时间触发下次。
示例:
该应用程序应该运行很长一段时间(它是仅供企业使用的自助服务终端应用程序)。我在应用程序启动时重新安排警报,但这并不能解决我的问题,因为应用程序可以运行数天而无需重新启动。我需要检测时间何时变化,以便根据新的本地时间再次安排警报。
我正在使用这个接收器:
<receiver android:name="foo.bar.receivers.TimeChangeReceiver" >
<intent-filter>
<action android:name="android.intent.action.ACTION_TIMEZONE_CHANGED" />
<action android:name="android.intent.action.ACTION_TIME_CHANGED" />
<action android:name="android.intent.action.DATE_CHANGED"></action>
</intent-filter>
</receiver>
它检测日期更改,但不适用于时间更改或时区更改。 (在运行OS 4.0.3的平板电脑上测试过)。这真的很奇怪,因为我可以清楚地看到在logcat中播放的事件。
所以我的问题:
ACTION_TIMEZONE_CHANGED
和ACTION_TIME_CHANGED
个事件,我怎么能解决它。提前致谢。
答案 0 :(得分:7)
你应该使用
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
<action android:name="android.intent.action.TIME_SET" />
代替
<action android:name="android.intent.action.ACTION_TIMEZONE_CHANGED" />
<action android:name="android.intent.action.ACTION_TIME_CHANGED" />
请参阅ACTION_TIMEZONE_CHANGED和ACTION_TIME_CHANGED。并观察这些常数给出的值。
对于DST更改,请阅读Does Android AlarmManager handle daylight saving changes?