我有这段代码
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秒时,警报会很好地执行。
答案 0 :(得分:10)
您正在使用AlarmManager.ELAPSED_REALTIME_WAKEUP
标志,但您正在使用Calendar对象。这两件事情并没有结合在一起。
如果使用日历或日期对象指定闹钟时间(自1970年以来的毫秒数),则需要使用AlarmManager.RTC或AlarmManager.RTC_WAKEUP
。
当您通过AlarmManager.ELAPSED_REALTIME
指定闹钟时间时(自手机启动后的毫秒数),您可以使用AlarmManager.ELAPSED_REALTIME_WAKEUP
或SystemClock.elapsedRealtime()
。
答案 1 :(得分:8)
我成功使用以下代码,如果您只想为下一次出现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 ...
}
答案 2 :(得分:4)
要使警报从现在起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。