2014-09-20 62 views
2

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

背景


我目前正在开发Android应用程序,它围绕着一个用户指定时间的闹钟。我的意图是它将用于在早上醒来(和第二天早上 - 又名重复报警)。当闹钟进入时,它会呼叫一个 Activity,它有几个选项(如贪睡)。我已经完成了所有这些工作,但我遇到了一个问题。


问题


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

  • setInexactRepeating是不是很准确。我的测试显示,这在指定的时间大致被激活,文档指出,这一切都是相当模糊的;

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

    我的测试显示通常有5分钟的延迟。在this answer用户的平均延迟时间约为12分钟。当然,这对于一个在特定时间唤醒人们的系统来说不会这样。

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

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

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


问题


我使用了错误的类这个系统?对我来说,它似乎应该是一个合法的用法,但通过阅读文档让我想知道。或许还有另一个更适合这个系统的课程?

+0

@MikeM。我的意思是这是一个可能有点矫枉过正的功能。浪费电池来使用它。你提到的警告让我回想起setExact有点太过矫枉过正的感觉。我不希望应用程序在_exact_指定的时间持续运行。我不介意它是否会在30秒后发射(不是一分钟)。我只是想知道我是否使用了正确的类,因为非函数似乎很适合(我正在寻找一个inbetween函数)。也许我应该克服这种感觉并使用setExact;) – Bono 2014-09-20 15:18:02

+0

@MikeM。 Dang刚刚发现使用'setExact'需要我移动到API 19,这是我想避免的。是否真的没有其他选择使用这个类和/或它的功能? – Bono 2014-09-20 21:22:19

+1

@MikeM。学到了新东西。不知道你可以检查不同的API级别并相应地改变你的方法。感谢:) – Bono 2014-09-20 21:37:02

回答

2

您可以在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

重新设定报警与

setexact 。

希望这会有所帮助。