有没有更简单的方法来使用AlarmManager或设置基于实时的警报?

时间:2013-04-25 08:56:01

标签: android android-alarms

似乎根据实际经过时间计算时间的唯一方法(与设备休眠时停止的正常运行时间相反)是AlarmManager。

是否有一种 easy 方式来执行“基于wallclock”的延迟执行,例如通过AlarmManager周围的开源包装?

对于正常的计时操作,你可以使用一个处理程序,就像这样一个简单的任务一样简单:

  • 实现处理程序回调(无需注册)
  • 实例化处理程序
  • 调用sendEmptyMessageDelayed或类似函数
  • 要清除所有设置延迟,只需致电removeCallbacksAndMessages(null)

但是,Handler仅支持基于正常运行时间的延迟,有时这些延迟还不够(例如,如果您想每15分钟检查服务器是否有新消息)。

如果你想要那些,似乎你必须使用不太舒服的AlarmManager:

  • 定义警报操作
  • 创建接收器(通过创建专用接收器类并将其声明为清单,或实现接口,使用registerReciever注册接收器,并在完成后取消注册)
  • 为您的行动创建意图
  • 将所述意图包裹在未决意图中,如果要取消警报,则存储待处理意图
  • 获取警报管理器(这需要上下文)
  • 设置闹钟
  • 如果要取消闹钟,请使用存储的pendingIntent
  • 取消闹钟
  • 如果您决定对更改数据进行多次意图或意图,则必须将它们全部保存以便随后清理警报管理器

1 个答案:

答案 0 :(得分:0)

  

对于正常的计时操作,您可以使用处理程序

仅来自前台活动。 Handler用于长期投票的任何其他用途充其量是不可靠的,甚至忽略了您对正常运行时间计算的担忧。

  

定义警报动作

这不是必需的。这甚至不是一个好主意。

  

创建接收器(通过创建专用接收器类并将其声明为清单,或实现接口,使用registerReciever注册接收器,并在完成后取消注册)

如果您希望在不在前台时发生事件,并且在设备处于睡眠状态时警报响起(_WAKEUP警报),则需要清单注册的接收器。如果不需要_WAKEUP,服务就足够了。如果您只需要站在前台并在活动中接收活动,请使用createPendingResult()为您提供PendingIntent,以触发您的活动onActivityResult()。但是,在后一种情况下,在postDelayed()View上使用Handler会更有意义。

  如果要取消闹钟,请

并存储待处理的意图

如果选择存储PendingIntent,则只需HandlerAlarmManager就不合适了。要取消警报,您需要等效PendingIntent(基础Intent对象基于filterEquals()匹配的PendingIntent以及PendingIntent操作[活动,服务,广播]的位置同样的。)

  

如果要取消闹钟,请使用存储的pendingIntent

取消闹钟

不,您可以通过创建等效的PendingIntent来取消它。

  

如果您决定对更改数据进行多次意图或意图,则必须将它们全部保存以便随后清理警报管理器

不,您可以通过创建等效的ScheduledExecutorService来取消它们。

  

是否有一种简单的方法可以执行基于AlarmManager的开源包装器“wallclock”延迟执行?

为此创建包含80%工作的包装代码会比编写问题花费更少的时间。我不知道有一个专门的库,部分是因为它没有那么多。

或者,使用WakeLock和{{1}}作为短期内容。这不适合“每15分钟”场景,因为它会让设备始终保持清醒状态。