通过AlarmManager设置不精确的闹钟会有多少延迟?

4
使用AlarmManager设置闹钟时,如果您没有设置精确的闹钟时间,则可能会出现延迟触发闹钟的情况。这种延迟的范围有什么保证吗?如果延迟不超过一分钟,我想成为一个负责任的开发人员,不使用精确时间。但是我在文档中找不到关于延迟的规格说明。我希望能够获得一份文件,记录延迟的功能及其时间规格。
1个回答

5
“周期性闹钟”将会延迟至今天到期望响铃时间的时间间隔或者该闹钟周期的75%,其中最小延迟/间隔为10秒。这是来自于API19的Android源码AlarmManagerService(截至API23仍然适用)。根据请求的时间,批处理窗口的长度如下:1分钟->1-1¾分钟,10分钟->10-17½分钟,30分钟->30-52½分钟,1小时->1-1¾小时。值得注意的是,虽然AlarmManagerService会保护窗口长度以确保长度大于半天被视为可疑(并重写为1小时),但它不会为触发时间提供类似的检查。
作为结果,您可以轻松地使用基于RTC的值(System.currentTimeMillis())提供经过时间的模式(ELAPSED_REALTIME),并最终获得一个数千年的闹钟。

这是基于官方文档吗?其他版本的Android呢?我能确定在所有Android版本中,我的重复闹钟不会延迟超过其时间间隔的75%吗?这是针对setInexactRepeating()还是setRepeating()? - Mehran Zamani
这是基于Android源代码的(请参见我的答案中的链接)- 这是最权威的文档 ;)如上所述,此函数从API19到23没有更改,并且快速检查显示相同的函数在[API 25](http://androidxref.com/7.1.1_r6/xref/frameworks/base/services/core/java/com/android/server/AlarmManagerService.java#708)中也没有更改。 - Kas Hunt
谢谢您的快速回答。您在回答中没有提到您所说的是setInexactRepeating()还是setRepeating()。 - Mehran Zamani
这取决于您的targetSDK版本。您可以在代码这里这里中查看。如果您的targetSDK版本是API19(KitKat)或更高版本,则setRepeating()和setInexactRepeating()执行相同的操作(所有闹钟都是不精确的)。如果您的目标小于API19,则setRepeating将是精确的。 - Kas Hunt
电信网络提供的时间可能因为任何原因而滞后数千年,但这没问题。 - straya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接