使用定时器重复IntentService - 是否可取?

时间:2014-06-16 10:39:20

标签: android android-alarms android-intentservice

我有IntentService从服务器下载数据,我希望IntentService以特定间隔检查服务器更新。但是,以下帖子建议不要使用Service重复Timer - 而是强调使用AlarmManager

Why doesn't my Service work in Android? (I just want to log something ever 5 seconds)

Android - Service: Repeats only once

Android service stops

在Android的参考手册中,IntentService被描述为:

  

IntentService是服务的基类,可根据需要处理异步请求(表示为Intents)。客户端通过startService(Intent)调用发送请求;服务根据需要启动,使用工作线程依次处理每个Intent,并在工作失败时自行停止。

     

这个"工作队列处理器"模式通常用于从应用程序的主线程卸载任务。存在IntentService类以简化此模式并处理机制。要使用它,请扩展IntentService并实现onHandleIntent(Intent)。 IntentService将接收Intents,启动工作线程,并根据需要停止服务。

     

所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。

我不太了解的部分是IntentService(帖子的问题是针对Service而不是IntentService)不允许执行的原因重复使用Timer,因为它创建自己的工作线程以供执行。允许在Timer内使用IntentService吗?或者AlarmManagers是定期执行IntentService的唯一解决方案吗?

对此的解释将非常受欢迎。

1 个答案:

答案 0 :(得分:8)

  

或者AlarmManagers是定期执行IntentService的唯一解决方案吗?

如果您希望它可靠地工作,是的。使用AlarmManager对用户来说也更友好。

首先,当主动向用户提供价值 时,运行 的任何表单Service。观看时钟标记并不是主动为用户提供价值。运行Service会使您的流程优先于其他流程,就终止哪些流程以释放系统RAM以备将来工作而言。不必要地Service - 例如只是看时钟滴答 - 会阻碍用户多任务处理的能力,因为你不必要地占用系统RAM。

此行为会导致某些用户使用任务杀手攻击您,例如从最近任务列表中滑动您的应用。这将终止您的流程,因此您的Timer也会消失。同样,由于太多草率开发人员长时间保持Service左右,Android会在一段时间后自动终止此类流程,Service尽管如此。

最后,通常“以一定间隔检查服务器更新”的一个方面是,即使设备进入睡眠模式,您也希望进行此项工作。使用永久服务方法,需要使用WakeLock始终保持CPU开启状态。这将显着影响用户的电池,导致您的应用程序出现在“设置”应用的“电池责任屏幕”上。结合捆绑系统RAM“功能”,可能会对您的应用程序产生一些不良评级。

相反,使用AlarmManager

  • 您的IntentService只需要在它正在工作时运行(“检查服务器更新”),在这些事件之间消失,这样您的进程就可以终止以释放系统RAM对于用户正在做的其他事情

  • 通过使用WakefulBroadcastReceiverWakefulIntentService模式,您可以短暂唤醒设备以执行此项工作,然后让设备重新进入休眠状态,从而最大限度地减少对设备的影响电池