如何在Android 4.4中设置精确、重复的闹钟?

16

现在,我正在这样设置闹钟:

        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。

我可以采取什么措施来设置精确重复闹钟?


阅读此帖子:https://dev59.com/8IDba4cB1Zd3GeqPIcX5 - Phantômaxx
1个回答

30

不幸的是,重复定时的预定时间并不精确。我读到说它们可能会不准确一个完整的周期!

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

那么,我该怎么做才能设置一个精确的重复闹钟呢?

使用setExact()来控制您的初始延迟。然后,在处理该事件的工作中,使用setExact()来控制下一次所需的时间。换句话说,您需要自己完成“重复”部分。

是的,这很烦人。

这是故意的烦人行为,旨在引导开发人员不要使用精确重复闹钟,因为与其不精确的兄弟相比,它们对电池的影响更大。如果用户会察觉到不精确的行为并且不会欣赏它,请随意使用setExact()使闹钟在用户想要时触发。但是,如果用户不会察觉不精确的行为,请使用不精确的闹钟,因为用户可能会注意到您的精确闹钟对电池的影响。


我需要设置一个精确的重复闹钟,因为这是我的应用程序的重点 :( 我希望我可以使用不精确的。我想我的主要问题是我可以在我的代码中使用SetExact(),但是我应该在哪里再次安排闹钟呢?在广播接收器中吗?怎么做? - Kala J
4
@KalaJ:“在广播接收器中?”——根据你问题中的代码,是的。“怎么做?”——在onReceive()方法中通过调用AlarmManagersetExact()方法指定你希望再次获得控制的时间。请记住,“exact”这个词有点误导性,因为Android不是实时操作系统,所以你将会在你最初设置的时间附近获得控制权,而不是精确地在那个时间点上。因此,你应该在你的BroadcastReceiver中调用setExact()方法来指定你真正想要获得控制权的时间,而不仅仅是从现在开始增加X秒钟的时间,否则在多个闹钟周期内的累积漂移可能会给你带来一些问题。 - CommonsWare
好的,但如果我有几个应该完全重复的闹钟呢?我只需要使用唯一的待处理意图来区分它们吗?如果是这样,那么我只需要说如果这个待处理意图...那么就做这个。如果这个待处理意图,那么就做那个? - Kala J
3
@KalaJ问:“我还能指定间隔 / 重复频率吗?”-- 不行。setExact()类似于旧的set()。它是一个一次性事件。这就是为什么你需要在每个事件上调用它来设置下一个事件。“之后它会无限期地重复吗,像setRepeating吗?”-- 不会。这就是为什么你需要在每个事件上调用它来设置下一个事件。“我需要做任何其他特殊的事情吗?”-- 你需要在每个事件上调用它来设置下一个事件。 - CommonsWare
3
我的 PowerHungry 示例应用展示了如何使用 setExact() 模拟一个精确的重复闹钟,但我并不担心事件时间漂移。 - CommonsWare
显示剩余9条评论

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