TimerTask与AlaramManager,我应该使用哪一个?

时间:2014-04-30 12:12:17

标签: android

我正在开发一个应用程序,它在屏幕打开后每隔10分钟触发一次动作(比如吐司消息),并在屏幕关闭后停止动作。 我已经将TimerTask用于此目的。 我应该开始使用AlaramManager而不是TimerTask还是继续使用TimerTask? 我知道两者之间的区别,但无法弄清楚使用哪种。

2 个答案:

答案 0 :(得分:9)

不能同意nikis的回答

TimerAlarmManager是满足不同需求的解决方案。

计时器仍然是一个“任务”,这意味着这是应用程序的一个线程,这意味着应用程序的某个组件必须在设备上运行才能保持计时器的活动状态。 如果您将计时器设置为10分钟事件 - 您无法确定您的应用程序是否会在某个时刻被系统处理。如果设备将进入睡眠模式,则可以停止计时器。为了防止这种行为,你必须使用PowerLock和耗尽电池

AlarmManager是系统服务(在您的应用程序之外运行),这意味着即使您的应用程序在设置警报后被杀死,也会发送待处理的意图。

一些例子: 你必须每隔1秒在视图上闪烁一些“led” - 使用Timer - 只有当应用程序在前台时才需要它,间隔很短 - 没有必要使用AlarmManager来完成这样的任务。

您在10秒后运行了一次任务 - Handler.postDelay();将是最佳解决方案,并且作业将在主线程(UI)上完成。

如果设备上有一些新内容要推送到服务器,则必须每10分钟检查一次 - 使用AlarmManager - 您的应用程序不需要一直处于活动状态,只需让系统每10分钟开始一份工作 - 就是这样。

答案 1 :(得分:2)

在大多数情况下,您绝对应该使用AlarmManager,因为(来自文档):

只要警报接收器的AlarmManager方法正在执行,onReceive()就会保持CPU唤醒锁定。这可以保证在您完成广播处理之后手机不会睡眠。 onReceive()返回后,AlarmManager会释放此唤醒锁定。这意味着在onReceive()方法完成后,手机会在某些情况下立即进入睡眠状态。

虽然您不需要在屏幕关闭时触发任何事件,AlarmManager仍会通过对警报进行分组来节省电量,当您使用setInexactRepeating时(但这对您来说并不重要,因为你的间隔是10分钟)。而且,它可以触发应用程序未运行的事件。我投票赞成AlarmManager,因为这是一种很好的做法,但考虑到你的条件,你可以离开Timertask

顺便说一句,你也可以使用Handler,我认为这是最好的选择。