AlarmManager的setRepeating和setInexactRepeating之间的区别

时间:2014-01-20 11:35:46

标签: android alarmmanager android-alarms

以下参数是什么:

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

以下内容:

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

有什么区别,两者在功能方面有何不同?

5 个答案:

答案 0 :(得分:33)

两个示例都安排了一个重复警报,该警报将发送给定的alarmIntent。在这两种情况下,第一次发送时都会立即发送(calendar.getTimeInMillis()返回the current time)。在这两种情况下,当需要发送警报时,设备将被唤醒(AlarmManager.RTC_WAKEUP显示)。

这些电话之间有两个不同之处。更简单的是,意图将在第一次呼叫时每十五分钟发送一次,而在第二次呼叫时每天发送一次(正如您在第三个参数中看到的那样)。更复杂的区别是函数调用本身:setRepeating将每15分钟安排完全的第一个警报; setInexactRepeating会每24小时为大约安排第二次警报,这意味着它可能会偏离该间隔 - 具有消耗更少电量的优势。

请注意,这在API 19中发生了变化,其中这两个调用是同义词。请参阅this guidethis API documentation

答案 1 :(得分:15)

确定警报需要的准确程度

选择警报类型通常是创建警报的第一步。另一个区别是你需要警报的准确程度。

对于大多数应用来说, setInexactRepeating() 是正确的选择。当您使用此方法时, Android会同步多个不准确的重复警报并同时触发它们。这样可以减少电池的消耗。

对于具有严格时间要求的罕见应用程序,警报需要在下午4点触发精确。然后每天使用 setRepeating()

参考:Decide how precise your alarm needs to be

答案 2 :(得分:9)

为了增加以前的答案,在使用重复警报时需要考虑许多其他最佳做法,尤其是使用setInexactRepeating()请求的不准确警报。

警报类型

  • 从电源管理角度来看,非WAKEUP警报优于WAKEUP警报。使用前者,您的警报可能会触发较晚,但在用户吵醒设备或其他唤醒警报触发时仍会触发警报。使用WAKEUP警报会将设备从睡眠状态唤醒,消耗额外的电池并可能导致其他不准确的警报发生延迟,否则可能会延迟更长时间(降低不精确警报提供的配电节能优势)。
  • 首选使用ELAPSED时基而不是RTC时基的闹钟。前者比RTC警报更可能在设备之间进行更随机的分发,这可以降低网络拥塞的风险,并且如果警报触发某种轮询,则可以降低服务器上的风险。运行姜饼(或更老)的电话遭受一个错误,即RTC不精确警报具有与实时时钟紧密对齐的倾向,例如,每隔一刻钟大约30秒。 ELAPSED警报不会受到这些早期平台版本上的此错误的影响。即使您的警报没有触发任何网络活动,请记住,如果它是一个唤醒警报,它可能会触发可能会触及网络的其他警报非唤醒意图。

<强>时基

  • 请注意在警报类型的正确时域中指定请求的开始时间。如果设置带有ELAPSED时基的RTC警报,或者如果使用RTC时基设置ELAPSED警报,将来可能会导致过去设置警报(它们立即开火)。您可以通过dumpsys alarm
  • 查看应用已使用adb shell安排了哪些闹钟

<强>间隔

  • 在SDK&lt; 19上指定除AlarmManager API中定义的间隔常数之外的任何其他不准确的警报间隔是多余的:它们将被安排为完全不准确的警报,失去了不精确警报提供的所有节能优势。

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

答案 3 :(得分:3)

setRepeating更准确 setInexactRepeating用于节省电池但没有准确,例如setInexactRepeating适用于后台维护,例如闹钟时需要setRepeating。

答案 4 :(得分:0)

Use setInexactRepeating()用于不认真使用应用程序(例如在清晨醒来)时使用。如果警报大约在该时间醒来,则没有生命危险。 例如药丸应用程序,其中高度危急的患者使用该应用程序来提醒护士或医生人员必须使用setRepeating()。 当您使用setInexactRepeating() 然后Android会同步来自多个应用程序的重复警报,并同时触发一次。这减少了系统必须唤醒设备的总次数。 从而减少电池的电量消耗。 重复警报是不准确的。请注意,尽管setInexactRepeating()是对setRepeating()的改进, 如果每个应用实例都在同一时间访问服务器,它仍然可能使服务器不堪重负。因此,对于网络请求,请为警报添加一些随机性。