看来,时间的行为的唯一办法根据实际经过的时间(相对于正常运行时间,当设备睡眠停靠)是AlarmManager。
有没有一种简单的方法做“壁钟”,通过各地AlarmManager一个开源的基于封装延迟exectuion,例如?
对于普通的计时的操作,您可以使用一个处理程序,这是因为这样一个简单的任务应该是一样容易:
- 落实处理程序回调(无需注册)
- 实例化处理程序
- 呼叫sendEmptyMessageDelayed或类似的功能
- 要清理所有设置延迟,只需拨打
removeCallbacksAndMessages(null)
然而,处理程序只支持基于正常运行时间延迟,(如果你想检查服务器是否有新邮件每隔15分钟EG)有时是不够的。
如果你想这些,看来你必须使用AlarmManager,这是不是很舒服:
- 定义一个动作你报警
- 创建一个接收器(或者通过创建专用接收机类,并声明它清单,或实现接口,登记使用registerReciever接收机,并在完成后注销它)
- 为您的行动意图
- 总结说,挂起意图意图,如果你想取消报警储存待处理的意图
- 取报警管理器(这需要上下文)
- 设闹钟
- 当你想取消报警,使用存储的PendingIntent取消
- 如果您决定有多个意图或意图与变化的数据,你必须拯救他们都在事后清理报警经理
对于普通的计时的操作,您可以使用一个处理程序
只有从前台活动。 任何其他用途的Handler
进行长期轮询是不可靠的,在最好的,甚至忽略了你的正常运行时间方面关注的计算。
定义一个动作你报警
这是没有必要的。 它甚至不是一个好主意。
创建一个接收器(或者通过创建专用接收机类,并声明它清单,或实现接口,登记使用registerReciever接收机,并在完成后注销它)
如果您希望事件时,你是不是在前台,并走下车报警发生时设备处于睡眠状态( _WAKEUP
报警),要求清单注册的接收器。 如果_WAKEUP
是不需要的,服务就足够了。 如果你只需要在前台,并在活动中收到的情况下,使用createPendingResult()
给你PendingIntent
将触发onActivityResult()
的活动。 不过,在后一种情况下,它会更有意义使用postDelayed()
上View
或Handler
。
并储存待处理的意图,如果你想取消报警
如果存储PendingIntent
是一个选项,然后Handler
是你所需要的,而AlarmManager
是不合适的。 要取消报警,则需要一个等效PendingIntent
(一个其中底层Intent
对象匹配基于filterEquals()
并且其中PendingIntent
操作[活动,服务,广播]是相同的)。
当你想取消报警,使用存储的PendingIntent取消
不,你通过创建一个相当于取消它PendingIntent
。
如果您决定有多个意图或意图与变化的数据,你必须拯救他们都在事后清理报警经理
不,你通过创建一个相当于取消它们PendingIntent
。
有没有一种简单的方法做“壁钟”,通过各地AlarmManager一个开源的基于封装延迟exectuion,例如?
创建这个覆盖80%的工作封装代码会采取你的确要比写你的问题更少的时间。 我不知道这个专用库,部分原因是因为不会有所有的东西给它。
或者,使用ScheduledExecutorService
和WakeLock
,短期的事情。 这是不适合“每15分钟”的情况,因为它使设备清醒所有的时间。
文章来源: Is there an easier way to use AlarmManager or to set real-time based alarms?