【问题标题】:Is there an accurate repeating-alarm system for Android?是否有适用于 Android 的准确重复警报系统?
【发布时间】:2014-09-20 12:42:19
【问题描述】:

背景


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


问题


我正在使用AlarmManager 来处理我的警报需求。然而,课堂上发生了一些奇怪的事情(在我看来)。有两种建议的方法来处理闹钟时间的设置。即setInexactRepeatingsetRepeating。这些功能的问题是:
  • setInexactRepeating 不是很准确。我的测试表明,这在指定时间大约被激活,文档表明,这一切都相当模糊;

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

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

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

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

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


问题


我为这个系统使用了错误的类吗?对我来说,这似乎应该是一种合法的用法,但通读文档让我感到疑惑。是否还有其他更适合该系统的类?

【问题讨论】:

  • @MikeM。我的意思是它是一个可能有点矫枉过正的功能。使用它有点浪费电池。你提到的警告让我回到了 setExact 有点过分的感觉。我不希望应用程序在 exact 指定的时间本身运行。我不介意它是否会在 30 秒左右(不是一分钟)后触发。我只是想知道我是否使用了正确的类,因为没有一个函数似乎非常适合(我可能正在寻找一个中间函数)。也许我应该克服这种感觉并使用 setExact ;)
  • @MikeM。 Dang,刚刚发现使用 setExact 需要我升级到 API 19,这是我想避免的。真的没有其他选择来使用这个类和/或其功能吗?
  • @MikeM。学到了一些新东西。不知道您可以检查不同的 API 级别并相应地更改您的方法。谢谢:)
  • 有任何可行的解决方案吗?
  • @droid_dev 不幸的是,我已经被淹没了,所以我很快就没有时间输入答案了。为了让您顺利上路,您可以创建一个检查 android.os.Build.VERSION 的 if 语句。如果等于或高于19,则使用exactRepeating,如果低于setRepeating。希望对您有所帮助(目前)。

标签: android alarmmanager


【解决方案1】:

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();
    }

你必须用

设置闹钟

准确的

再次在 rescheduleAlarm 中。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多