Android是否有准确的重复警报系统?

时间:2014-09-20 12:42:20

标签: android alarmmanager

背景


我目前正在开发Android应用程序,它围绕用户指定时间发出的警报。我的意图是,它将用于在早上醒来(第二天早上 - 也就是重复闹钟)。当闹钟响起时,它会调用Activity,其中有两个选项(例如小睡)。我已经完成了所有这些工作,但我遇到了问题

问题


我正在使用AlarmManager来处理我的警报需求。然而,课堂上有一些奇怪的事情(在我看来)。有两种建议的方法来处理闹钟时间的设置。即setInexactRepeatingsetRepeating。这些功能的问题是:

  • setInexactRepeating不是很准确。我的测试表明,这在指定时间大致激活,文档指出,所有这些都是相当模糊的;

      

    在此时间之前警报不会触发,但在第一次调用警报之前可能会有几乎整个警报间隔的延迟。

    我的测试显示通常有5分钟的延迟。在this answer,用户平均延迟大约12分钟。当然,对于一个应该在指定时间唤醒人们的系统,这是行不通的

  • setRepeating会在指定时间触发。然而,文档指出,从API 19开始,所有重复警报都是不精确的。这正是我不想要的。

      

    从API 19开始,所有重复警报都不准确。由于此方法自API 3开始提供,因此您的应用程序可以安全地调用它,并确保它将在当前和旧版本的Android上获得类似的行为。

setExact方法,但这有点过于具体。除此之外,它没有让我选择有一定的间隔(每天重复警报)。 编辑:在尝试使用setExact后,我发现这需要我升级到API 19(目前在15),这是我想避免的。


问题


我在这个系统上使用了错误的类吗?对我而言,它似乎应该是一种合法用法,但通过文档阅读让我感到疑惑。是否有另一类更适合这个系统?

1 个答案:

答案 0 :(得分:3)

您可以在API 19之前和API 19之后分开。第一次设置闹钟时:

            if (Build.VERSION.SDK_INT >= 19) {
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), mondayIntent);
            } else {
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                        AlarmManager.INTERVAL_DAY * 7, mondayIntent);
            }

当你发现警报时:

    if (Build.VERSION.SDK_INT >= 19) {
        rescheduleAlarm();
    }

您必须使用

设置闹钟
  

setexact

再次在rescheduleAlarm。

希望这有帮助。