Android 不精确的AlarmManager.SetRepeated问题

Android 不精确的AlarmManager.SetRepeated问题,android,alarmmanager,Android,Alarmmanager,我在API 19的几篇文章中读到,所有重复的警报都是不精确的。 这是否意味着,每台运行安卓4.4的设备都无法实现精确的重复?或者我可以通过在我的项目中使用android:targetSdkVersion=“18”在此类设备上简单地避免这种情况 我想我不需要API 19的功能,但无论如何,使用setExact并在每次调用报警时更新时间是否是一种更好的方法?在我的应用程序中,用户应该设置每天收到通知的时间 这是否意味着,每台运行安卓4.4的设备都无法实现精确的重复 这意味着,如果您的android:

我在API 19的几篇文章中读到,所有重复的警报都是不精确的。 这是否意味着,每台运行安卓4.4的设备都无法实现精确的重复?或者我可以通过在我的项目中使用android:targetSdkVersion=“18”在此类设备上简单地避免这种情况

我想我不需要API 19的功能,但无论如何,使用setExact并在每次调用报警时更新时间是否是一种更好的方法?在我的应用程序中,用户应该设置每天收到通知的时间

这是否意味着,每台运行安卓4.4的设备都无法实现精确的重复

这意味着,如果您的
android:targetSdkVersion
为19或更高,那么像
set()
setRepeating()
这样的方法现在默认情况下是不精确的。有一个
setExact()
可用于精确报警,您可以自己执行重复部分,方法是再次调用
setExact()
,作为处理先前
setExact()
调用触发的工作的一部分

或者我可以通过在我的项目中使用android:targetSdkVersion=“18”在此类设备上简单地避免这种情况

是的,你可以避免这种情况。不过,最终还是会有一些事情迫使你将你的
android:targetSdkVersion提升到19或更高。这意味着最终,你要么需要调整你的应用程序以适应不精确的行为,要么使用我上面描述的
setExact()

使用setExact并在每次调用报警时更新时间是否是更好的方法


由于API级别19之前不存在
setExact()
,因此只能在较新的设备上使用此功能。一旦将您的
android:targetSdkVersion设置为19或更高,您将需要在这些较新的设备上开始使用
setExact()
,而在较旧的设备上仍然使用
set()
setRepeating()
。我不知道使用
setExact()
的好处,但仍然有
android:targetSdkVersion
低于19。

谢谢你的回答,它帮了我很大的忙。因此,我将目标设置为18。@Commonware是否需要在调用下一个setexact之前取消onReceive回调中的上一个setexact?onReceive在几秒钟内调用了两次?有什么原因吗?@NitZRobotKoder:
setexact()
不会重复-这是一个一次性事件。如果您不再需要它,只需
cancel()
it,例如用更新的时间替换它。我建议您使用
adb shell dumpsys alarm
查看计划的事件,并确定是否出于某种原因意外计划了两个。@Commonware ok right。。我在这里看到了你的帖子。我正在做“setExact()-in-a-loop”来实现重复的东西。。我有这个问题。所以当我在循环中使用setExact时,我看到onReceive在一个时间表中调用了两次。哦,上帝,我有时讨厌Android。只有在我必须创建一个精确的、跨重启的循环警报之后,我才意识到警报管理器内部碎片、作业调度程序、工作管理器,甚至Evernote的lib等等之间的任务是多么疯狂。。