安卓系统有可靠的重复闹钟系统吗?

3

背景


我正在为Android开发一个应用程序,它围绕着一个用户指定时间的闹钟进行。我的意图是让它用于叫醒人们在早上(以及接下来的一天 - 即重复闹钟)。当闹钟响起时,它会调用一个具有几个选项(如贪睡)的Activity。我已经把所有这些都搞定了,但我遇到了一个问题。


问题


我正在使用AlarmManager来处理我的闹钟需求。然而,该类有一些奇怪的问题(在我看来)。有两种建议处理设置闹钟时间的方式,即setInexactRepeatingsetRepeating。这些函数的问题是:

  • setInexactRepeating不太准确。我的测试显示它大约在指定时间激活,这也是文档所指示的,尽管有些含糊不清:

    闹钟将不会在此之前响起,但是在闹钟间隔的几乎整个延迟时间内可能会存在一个延迟。

    我的测试显示通常会有5分钟左右的延迟。在这个答案中,用户平均延迟大约为12分钟。当然,对于一个旨在在指定时间叫醒人们的系统来说,这是无法接受的。


  • setRepeating可以在指定时间触发。但是文档规定,从API 19开始,所有重复的闹钟都是不准确的。这正是我不想要的。

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

有一个setExact方法,但这个方法太具体了。此外,它不给我设定特定的时间间隔(以便每天重复闹钟)。编辑:尝试使用setExact后,我发现这需要我升级到API 19(当前为15),这是我想避免的。


问题


我是否在使用错误的类别?对我来说,它似乎应该是一个合法的用法,但是阅读文档让我感到困惑。也许还有另一个更适合这个系统的类别吗?


@MikeM。我的意思是这个函数可能有点过度杀伤力了。使用它会浪费电池。你所提到的警告让我觉得setExact有点过度杀伤力了。我不想让应用程序在“确切”的指定时间运行。如果它晚了30秒左右(只要不是一分钟),我并不介意。我只是想知道我是否使用了正确的类,因为没有一个函数似乎很合适(也许我需要一个中间函数)。也许我应该克服这种感觉,使用setExact ;) - Bono
@MikeM. 当,刚刚发现使用 setExact 需要将 API 升级至 19,这是我想避免的。难道没有其他选项可以使用此类或其函数吗? - Bono
1
@MikeM。学到了新东西。没想到你可以检查不同的API级别并相应地更改你的方法。谢谢 :) - Bono
有任何可行的解决方案吗? - moDev
1
@droid_dev 很抱歉,我现在非常忙,无法立即为您编写答案。为了让您开始工作,您可以编写一个if语句来检查android.os.Build.VERSION。如果它等于或高于19,请使用exactRepeating,如果低于,请使用setRepeating。希望这能帮到您(目前为止)。 - Bono
@Bono,你找到任何解决方案了吗?我找不到类似exactRepeating的东西。 - H Raval
1个回答

4

在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

来设置闹钟。

希望这能帮到你。


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