Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当手动更改系统时间时,如何停止Android AlarmManager?_Java_Android_Alarmmanager - Fatal编程技术网

Java 当手动更改系统时间时,如何停止Android AlarmManager?

Java 当手动更改系统时间时,如何停止Android AlarmManager?,java,android,alarmmanager,Java,Android,Alarmmanager,下面是这个问题的一个扩展示例。现在是凌晨1:30。警报设定在今天晚些时候上午10点。我把电话时间改为昨天晚上11点59分。Alarm Manager会在错误的时间立即触发 如果时间已过,如何阻止AlarmManager响起 但是,如果我改变时间,什么也不会发生 我不希望这种情况发生在我的应用程序中,因为它不会发生在其他报警应用程序中。是否有办法确保报警管理器仅在设置的准确时间响起(如果没有跳过它) 这是我的报警管理器代码 Calendar alarmCal = closestAl

下面是这个问题的一个扩展示例。现在是凌晨1:30。警报设定在今天晚些时候上午10点。我把电话时间改为昨天晚上11点59分。Alarm Manager会在错误的时间立即触发

如果时间已过,如何阻止AlarmManager响起

但是,如果我改变时间,什么也不会发生

我不希望这种情况发生在我的应用程序中,因为它不会发生在其他报警应用程序中。是否有办法确保报警管理器仅在设置的准确时间响起(如果没有跳过它)

这是我的报警管理器代码

        Calendar alarmCal = closestAlarm.toCalendar();

        Intent alarmIntent = new Intent(this, ActiveAlarmService.class);
        alarmIntent.putExtra("alarm", closest);

        pendingAlarm = PendingIntent.getService(AlarmService.this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);

        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCal.getTimeInMillis(), pendingAlarm);

我曾尝试使用BroadCaseTree接收器捕捉时间/日期更改事件,但广播和AlarmManager触发之间存在太多延迟,因为它是在过去设置的。

我找到了解决方案。它摸起来很奇怪,但很结实

这是我最初使用的

alarmManager.set(AlarmManager.RTC_WAKEUP, 
    alarmTimeCalendar.getTimeInMillis(), pendingAlarmIntent);
这就是解决办法

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTimeCalendar.getTimeInMillis(),
    AlarmManager.INTERVAL_DAY, pendingAlarmIntent);

您必须管理和取消此AlarmManager,就像它是第一种方法一样。如果您忘记了,您的闹钟将在不应该的时候响起。

您可以随时手动检查时间。设置任何其他类型的计时器都不是一个好主意-如果你要在遥远的将来设置计时器,那么如果你的服务或活动关闭,你需要使用一个持续的警报。@Gabeschen,我想我可以做到。对于我来说,要手动检查时间,我需要在它启动的服务中这样做,这感觉就像它在如此琐碎的事情上使用了大量不必要的代码和处理能力。我同意计时器,那是个坏主意。我已经稍微更新了我的问题。我没有答案给你(我没有见过这种行为,但我也没有真正尝试过)。我有一个警告给你-精确是很难在安卓系统。在KitKat中,许多am函数被更改为显式地不按时触发,以防止唤醒。在Marshamallow中,他们添加了第二层(现在有set、setExact、setInexact、setAndAllowHileidle和setExactAndAllowHileidle)。小心不要期望任何警报准确无误。设置在preKitKat上实际上是精确的,在post上基于您的目标SDK是不精确的。@Gabeschen,非常感谢。也谢谢你的提示,虽然我并不需要它精确,但我只需要它在设定的那一刻响。我真的很惊讶为什么它在你将时间改为晚上11:59,而闹钟设定为上午10点后立即开火。