如何在Android 4.4中设置准确,重复的警报?

Kal*_*a J 15 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, 0);

        timedate = cal.getTime();

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

        //Set Alarm to Repeat
        manager.setRepeating(AlarmManager.RTC_WAKEUP, timeInMilis, interval, pendingIntent);
Run Code Online (Sandbox Code Playgroud)

不幸的是,重复的预定时间是不准确的,我读到它们可能是完全间隔的不精确!

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

我该怎么做才能设置一个精确的重复警报?

Com*_*are 30

不幸的是,重复的预定时间是不准确的,我读到它们可能是完全间隔的不精确!

如果你targetSdkVersion是19或更高,是的.

我该怎么做才能设置一个精确的重复警报?

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

是的,这很烦人.

引导开发人员使用精确的重复警报是故意的,因为对于电池而言,它们比不熟悉的兄弟更糟糕.如果用户将感知到不精确的行为并且不会欣赏它,请随意使用setExact()以在用户需要时发出警报.但是,如果用户不会察觉到不准确的行为,请使用不准确的警报,因为用户可能会注意到您的确切警报对电池的影响.

  • @KalaJ:"在广播接收器中?" - 鉴于您的问题中的代码,是的."怎么样?" - 在`onReceive()`中的`AlarmManager`上调用`setExact()`,指示你想再次获得控制权.请记住,"确切"有点用词不当,因为Android不是实时操作系统,因此您将在初始时间附近获得控制权,而不是恰好在那时.因此,您需要在`BroadcastReceiver`中调用`setExact()`来指定何时需要控制"for realz",而不仅仅是从现在开始增加X时间,或者在几个警报周期内的累积漂移可能会导致一些问题. (4认同)
  • @KalaJ:"我还可以指定间隔/重复频率" - 不.`setExact()`就像旧的`set()`.这是一次性活动.这就是为什么你必须在每个事件上调用它来设置下一个事件."就像setRepeating一样,它会无限期地重复吗?" - 不.这就是为什么你必须在每个事件上调用它来设置下一个事件."我还需要做一些特别的事吗?" - 你必须在每个事件上调用它来设置下一个事件. (3认同)
  • @KalaJ:[我的`PowerHungry`示例应用程序](https://github.com/commonsguy/cw-omnibus/tree/master/JobScheduler/PowerHungry)演示使用`setExact()`来模拟精确的重复警报,尽管我我并不担心事件时间的流逝. (3认同)