2014-01-07 43 views
0

是否有人可以解释为什么下面的代码工作(用20秒的延迟,即第一个报警的火灾。)(即第一个火警瞬间)报警的setRepeating第一触发问题

Calendar cal = Calendar.getInstance(); 
cal.add (Calendar.SECOND,20); 
am = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC, cal.getTimeInMillis(), 20000, PendingIntent pi); 

,而下面是不是:

am = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime() + 20000, 20000, PendingIntent pi); 

回答

0

SystemClock.elapsedRealtime() [1]返回自启动以来的毫秒数。

cal.getTimeInMillis() [2]返回从UNIX Epoch(1970/01/01)开始的毫秒数...根据您的代码。

第一个代码块实际上是在将来安排20秒的警报。

第二个代码块实际上调度了遥远的过去的警报(除非您在1970年1月1日启动手机!),并且警报运行的时间已经过去了。警报还没有运行,所以它现在运行它,它已经过去了。

[1] http://developer.android.com/reference/android/os/SystemClock.html#elapsedRealtime()

[2] http://developer.android.com/reference/java/util/Calendar.html#getTimeInMillis()