似乎根据实际经过时间计算时间的唯一方法(与设备休眠时停止的正常运行时间相反)是AlarmManager。
是否有一种 easy 方式来执行“基于wallclock”的延迟执行,例如通过AlarmManager周围的开源包装?
对于正常的计时操作,你可以使用一个处理程序,就像这样一个简单的任务一样简单:
removeCallbacksAndMessages(null)
但是,Handler仅支持基于正常运行时间的延迟,有时这些延迟还不够(例如,如果您想每15分钟检查服务器是否有新消息)。
如果你想要那些,似乎你必须使用不太舒服的AlarmManager:
答案 0 :(得分:0)
对于正常的计时操作,您可以使用处理程序
仅来自前台活动。 Handler
用于长期投票的任何其他用途充其量是不可靠的,甚至忽略了您对正常运行时间计算的担忧。
定义警报动作
这不是必需的。这甚至不是一个好主意。
创建接收器(通过创建专用接收器类并将其声明为清单,或实现接口,使用registerReciever注册接收器,并在完成后取消注册)
如果您希望在不在前台时发生事件,并且在设备处于睡眠状态时警报响起(_WAKEUP
警报),则需要清单注册的接收器。如果不需要_WAKEUP
,服务就足够了。如果您只需要站在前台并在活动中接收活动,请使用createPendingResult()
为您提供PendingIntent
,以触发您的活动onActivityResult()
。但是,在后一种情况下,在postDelayed()
或View
上使用Handler
会更有意义。
如果要取消闹钟,请并存储待处理的意图
如果选择存储PendingIntent
,则只需Handler
,AlarmManager
就不合适了。要取消警报,您需要等效PendingIntent
(基础Intent
对象基于filterEquals()
匹配的PendingIntent
以及PendingIntent
操作[活动,服务,广播]的位置同样的。)
如果要取消闹钟,请使用存储的pendingIntent
取消闹钟
不,您可以通过创建等效的PendingIntent
来取消它。
如果您决定对更改数据进行多次意图或意图,则必须将它们全部保存以便随后清理警报管理器
不,您可以通过创建等效的ScheduledExecutorService
来取消它们。
是否有一种简单的方法可以执行基于AlarmManager的开源包装器“wallclock”延迟执行?
为此创建包含80%工作的包装代码会比编写问题花费更少的时间。我不知道有一个专门的库,部分是因为它没有那么多。
或者,使用WakeLock
和{{1}}作为短期内容。这不适合“每15分钟”场景,因为它会让设备始终保持清醒状态。