Java 如何在Android 4.4中设置精确的重复报警?

Java 如何在Android 4.4中设置精确的重复报警?,java,android,android-alarms,Java,Android,Android Alarms,现在,我正在设置如下警报: AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent

现在,我正在设置如下警报:

        AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

        timedate = cal.getTime();

        //convert date to milis
        long timeInMilis = (timedate.getTime());

        //Set Alarm to Repeat
        manager.setRepeating(AlarmManager.RTC_WAKEUP, timeInMilis, interval, pendingIntent);
不幸的是,计划的重复时间是不精确的,我读到他们可能是不精确的整个间隔

所以,我想切换到设置一个精确的重复警报。我的设备至少需要最新的API 19/Android 4.4,所以我不能使用setRepeating

我可以做些什么来设置精确的重复警报

不幸的是,计划的重复时间是不精确的,我读到他们可能是不精确的整个间隔

如果您的
targetSdkVersion
为19或更高,则为是

我可以做些什么来设置精确的重复警报

使用
setExact()
控制初始延迟。然后,作为处理该事件工作的一部分,使用
setExact()
在下一个所需时间获得控制权。瞧,你自己做“重复”部分

是的,这很烦人


引导开发人员不使用精确的重复警报是有意的,这是令人恼火的,因为这些警报对电池的影响比不精确的同类警报更糟糕。如果用户会察觉到不准确的行为而不欣赏它,请随意使用
setExact()
在用户需要时发出警报。但是,如果用户无法感知到不精确的行为,请使用不精确的警报,因为用户可能会注意到精确警报对电池的影响。

阅读这篇文章:我需要设置一个精确的重复警报,因为这是我应用程序的重点:(我希望我可以使用不精确。我想我的主要问题是我可以使用SetExact()以上是我的代码,但我应该在哪里重新安排警报?在广播接收器中?如何?@KalaJ:“在广播接收器中?”--给定您问题中的代码,是的。“如何?”--在
onReceive()
中调用
setExact()
上的
AlarmManager
,指示您希望再次获得控制权的时间。请记住“精确”有点用词不当,因为Android不是实时操作系统,因此您将在初始时间附近获得控制权,而不是在那个时候。因此,您需要在
广播接收器中调用
setExact()
,以指定何时需要realz的“控制权”",而不仅仅是从现在开始增加X时间,或者几个报警周期的累积漂移可能会给您带来一些问题。好吧,但如果我有几个报警应该准确重复?我只需要使用一个唯一的挂起意图来区分它们?如果是,那么我只会说如果这个挂起意图…那么就这样做。如果挂起的意图,然后再这样做?@KalaJ:“我仍然可以指定间隔/它重复的频率”--否。
setExact()
与旧的
set()
类似。这是一个一次性事件。这就是为什么你必须在每个事件上调用它来设置下一个事件的原因。“它会像setRepeating一样无限期地重复吗?”--不。这就是为什么您必须在每个事件上调用它来设置下一个事件。“我还需要做其他特别的事情吗?”--您必须在每个事件上调用它来设置下一个事件。@KalaJ:演示如何使用
setExact()
模拟精确的重复报警,尽管我不担心事件时间漂移。