如何设置警报以在固定时间正确触发?
Posted
技术标签:
【中文标题】如何设置警报以在固定时间正确触发?【英文标题】:How to set an alarm to fire properly at fixed time? 【发布时间】:2010-06-07 20:26:04 【问题描述】:我有这个代码
Calendar c = new GregorianCalendar();
c.add(Calendar.DAY_OF_YEAR, 1);
c.set(Calendar.HOUR_OF_DAY, 23);
c.set(Calendar.MINUTE, 22);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
// We want the alarm to go off 30 seconds from now.
long firstTime = SystemClock.elapsedRealtime();
firstTime += 30*1000;
long a=c.getTimeInMillis();
// Schedule the alarm!
AlarmManager am = (AlarmManager)ctx.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
c.getTimeInMillis(), 1*60*60*1000, sender);
它不会在 23:22h
执行我做错了什么?我注意到 firstTime 和 c.getTimeInMillis() 在大小和长度上差别很大。当我使用firstTime时,所以设置为30秒时,闹钟执行得很好。
【问题讨论】:
我在这个例子中看到了:google.com/codesearch/p?hl=en#kZ0MkhnKNzw/trunk/Photostream/src/… 【参考方案1】:您正在使用AlarmManager.ELAPSED_REALTIME_WAKEUP
标志,但您正在使用日历对象。这两件事不能放在一起。
如果您使用日历或日期对象(自 1970 年以来的毫秒数)指定闹钟时间,则需要使用 AlarmManager.RTC 或 AlarmManager.RTC_WAKEUP
。
当您通过SystemClock.elapsedRealtime()
(手机启动后的毫秒数)指定闹钟时间时,您使用AlarmManager.ELAPSED_REALTIME
或AlarmManager.ELAPSED_REALTIME_WAKEUP
。
【讨论】:
【参考方案2】:如果您只想为下一次出现 hh:mm 设置警报,我已成功使用以下代码
Calendar cal = new GregorianCalendar();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, 22);
cal.set(Calendar.MINUTE, 19);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
//check if we want to wake up tomorrow
if (System.currentTimeMillis() > cal.getTimeInMillis())
cal.setTimeInMillis(cal.getTimeInMillis()+ 24*60*60*1000);// Okay, then tomorrow ...
【讨论】:
如果时间过去了,这是第二天火警的确切答案【参考方案3】:要让闹钟在 30 秒后响起,请使用
Calendar cal = Calendar.getInstance();
获取当前时间,然后
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+30000, sender);
编辑:
我认为问题在于 ELAPSED_REALTIME_WAKEUP。这告诉 AlarmManager 你给它的时间是基于系统启动后的时间。从现在开始的 30 秒内都可以,但如果您希望它基于实时,您应该使用 RTC 或 RTC_WAKEUP。有关这些类型的完整说明,请参阅 javadoc。
【讨论】:
我需要在特定时间 23:22 出发。我已经有了一个可以在 30 秒内启动的有效解决方案,效果很好。以上是关于如何设置警报以在固定时间正确触发?的主要内容,如果未能解决你的问题,请参考以下文章