0

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

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

对于正常的计时操作,您可以使用处理程序,这很简单,因为这样一个简单的任务应该是:

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

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

如果你想要这些,似乎你必须使用AlarmManager,这不是很舒服:

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

1 回答 1

0

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

仅来自前台活动。Handler长期轮询的任何其他用途充其量是不可靠的,即使忽略您对正常运行时间计算的担忧。

为您的警报定义一个动作

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

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

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

如果要取消警报,请存储待处理的意图

如果存储 aPendingIntent是一种选择,那么Handler您只需要并且AlarmManager不合适。要取消警报,您需要一个等价物PendingIntent(基础Intent对象基于匹配filterEquals()PendingIntent操作 [活动、服务、广播] 相同)。

当您想取消警报时,请使用存储的 pendingIntent 取消它

不,您可以通过创建等效的PendingIntent.

如果您决定有多个意图或更改数据的意图,则必须将它们全部保存以在之后清理警报管理器

不,您可以通过创建等效的PendingIntent.

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

为此创建包含 80% 工作的包装器代码所花费的时间比编写问题所花费的时间要少。我不知道为此有专门的图书馆,部分原因是它不会有那么多。

或者,使用ScheduledExecutorServiceand a WakeLock,用于短期的事情。这不适合“每 15 分钟”的场景,因为它使设备始终处于唤醒状态。

于 2013-04-25T12:05:18.377 回答