AlarmManager的setRepeating和setInexactRepeating之间的区别

以下是什么参数:

alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent); 

以下几点:

 alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent); 

两者在function上有什么不同?

这两个例子安排一个重复的警报,将发送给定的alarmIntent 。 在这两种情况下,第一次发送都会立即( calendar.getTimeInMillis()返回当前时间 )。 在这两种情况下,当需要发送警报时,设备将被唤醒(由AlarmManager.RTC_WAKEUP显而易见)。

这些调用有两个区别。 更简单的是,意图将在第一次呼叫中每15分钟发送一次,第二次呼叫中每天发送一次(如你在第三个参数中看到的那样)。 更复杂的区别是函数调用本身: setRepeating精确地每十五分钟安排一次报警; setInexactRepeating大约每24小时安排第二次警报,这意味着它可能会偏离该时间间隔 – 消耗更less的功率。

请注意,API 19中的这两个调用是同义词。 请参阅本指南和此API文档 。

决定你的报警需要多么精确

select报警types通常是创build报警的第一步。 进一步的区别是你需要你的闹钟有多精确。

对于大多数应用程序, setInexactRepeating()是正确的select。 当您使用此方法时, Android会同步多个不精确的重复闹钟,并同时触发它们 。 这减less了电池的消耗。

对于以刚性时间要求为例的罕见应用程序来说,闹钟需要每天下午四点钟精确触发,然后使用setRepeating()

参考: 决定你的报警需要多么精确

为了增加以前的答案,在使用重复警报时要考虑许多其他最佳实践,特别是使用setInexactRepeating()请求的不精确的警报。

报警types

  • 从电源pipe理angular度看,非WAKEUP报警比WAKEUP报警要好。 使用前者,你的闹钟可能会晚点火,但是当设备被用户唤醒时,或者当另一个唤醒闹铃被触发时,它仍然会发射。 使用WAKEUP(唤醒)警报会将设备唤醒,消耗额外的电池,并有可能导致其他不准确的警报发生延迟,否则延迟的时间可能会延长(减less不准确警报提供的配料节能效益)。
  • 优先使用ELAPSED时基而不是RTC时基。 前者更可能在RTC报警中随机分布在各个设备上,这样可以降低networking拥塞的风险,如果报警触发了某种轮询,则可以在服务器上进行分配。 运行姜饼(或更老)的电话受到一个错误的影响,RTC不精确的警报倾向于与实时时钟紧密alignment,例如,每过去一刻钟约有30秒钟。 在这些早期的平台版本中,ELAPSED警报不会受到这个错误的影响。 即使您的闹钟没有触发任何networking活动,请记住,如果这是一个唤醒闹钟,它可能会触发其他可能触及networking的闹铃不唤醒意图。

时基

  • 请注意在报警types的正确时间域中指定请求的开始时间。 如果不使用此function,可能会导致在过去设置闹钟(它们会立即启动),如果使用RAT时基设置一个ELAPSED闹钟,那么设置一个具有ELAPSED时基的RTC闹钟或将来会很远。 您可以通过adb shell检查应用程序使用dumpsys alarm计划的dumpsys alarm

间隔

  • 指定AlarmManager API中定义的时间间隔常数以外的任何警报间隔在SDK <19中是冗余的:它们将被调度为精确而非不精确的警报,失去了不精确警报提供的所有节能优势。

编辑:这里是关于姜饼和蜂窝3.0设备的错误的进一步解释: https : //code.google.com/p/android/issues/detail? id =31550

setRepeating更准确setInexactRepeating用于保存电池但不准确 ,setInexactRepeating适用于后台维护,例如闹钟时需要setRepeating。