有没有办法使用AlarmManager或设定一个基于实时报警更简单的方法?(Is there an

2019-11-02 02:35发布

看来,时间的行为的唯一办法根据实际经过的时间(相对于正常运行时间,当设备睡眠停靠)是AlarmManager。

有没有一种简单的方法做“壁钟”,通过各地AlarmManager一个开源的基于封装延迟exectuion,例如?

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

  • 落实处理程序回调(无需注册)
  • 实例化处理程序
  • 呼叫sendEmptyMessageDelayed或类似的功能
  • 要清理所有设置延迟,只需拨打removeCallbacksAndMessages(null)

然而,处理程序只支持基于正常运行时间延迟,(如果你想检查服务器是否有新邮件每隔15分钟EG)有时是不够的。

如果你想这些,看来你必须使用AlarmManager,这是不是很舒服:

  • 定义一个动作你报警
  • 创建一个接收器(或者通过创建专用接收机类,并声明它清单,或实现接口,登记使用registerReciever接收机,并在完成后注销它)
  • 为您的行动意图
  • 总结说,挂起意图意图,如果你想取消报警储存待处理的意图
  • 取报警管理器(这需要上下文)
  • 设闹钟
  • 当你想取消报警,使用存储的PendingIntent取消
  • 如果您决定有多个意图或意图与变化的数据,你必须拯救他们都在事后清理报警经理

Answer 1:

对于普通的计时的操作,您可以使用一个处理程序

只有从前台活动。 任何其他用途的Handler进行长期轮询是不可靠的,在最好的,甚至忽略了你的正常运行时间方面关注的计算。

定义一个动作你报警

这是没有必要的。 它甚至不是一个好主意。

创建一个接收器(或者通过创建专用接收机类,并声明它清单,或实现接口,登记使用registerReciever接收机,并在完成后注销它)

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

并储存待处理的意图,如果你想取消报警

如果存储PendingIntent是一个选项,然后Handler是你所需要的,而AlarmManager是不合适的。 要取消报警,则需要一个等效PendingIntent (一个其中底层Intent对象匹配基于filterEquals()并且其中PendingIntent操作[活动,服务,广播]是相同的)。

当你想取消报警,使用存储的PendingIntent取消

不,你通过创建一个相当于取消它PendingIntent

如果您决定有多个意图或意图与变化的数据,你必须拯救他们都在事后清理报警经理

不,你通过创建一个相当于取消它们PendingIntent

有没有一种简单的方法做“壁钟”,通过各地AlarmManager一个开源的基于封装延迟exectuion,例如?

创建这个覆盖80%的工作封装代码会采取你的确要比写你的问题更少的时间。 我不知道这个专用库,部分原因是因为不会有所有的东西给它。

或者,使用ScheduledExecutorServiceWakeLock ,短期的事情。 这是不适合“每15分钟”的情况,因为它使设备清醒所有的时间。



文章来源: Is there an easier way to use AlarmManager or to set real-time based alarms?