我有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的参考手册中,IntentService被描述为:
IntentService是服务的基类,可根据需要处理异步请求(表示为Intents)。客户端通过startService(Intent)调用发送请求;服务根据需要启动,使用工作线程依次处理每个Intent,并在工作失败时自行停止。
这个"工作队列处理器"模式通常用于从应用程序的主线程卸载任务。存在IntentService类以简化此模式并处理机制。要使用它,请扩展IntentService并实现onHandleIntent(Intent)。 IntentService将接收Intents,启动工作线程,并根据需要停止服务。
所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。
我不太了解的部分是IntentService
(帖子的问题是针对Service
而不是IntentService
)不允许执行的原因重复使用Timer,因为它创建自己的工作线程以供执行。允许在Timer
内使用IntentService
吗?或者AlarmManagers
是定期执行IntentService
的唯一解决方案吗?
对此的解释将非常受欢迎。
答案 0 :(得分:8)
或者AlarmManagers是定期执行IntentService的唯一解决方案吗?
如果您希望它可靠地工作,是的。使用AlarmManager
对用户来说也更友好。
首先,当主动向用户提供价值 时,不运行 的任何表单Service
。观看时钟标记并不是主动为用户提供价值。运行Service
会使您的流程优先于其他流程,就终止哪些流程以释放系统RAM以备将来工作而言。不必要地Service
- 例如只是看时钟滴答 - 会阻碍用户多任务处理的能力,因为你不必要地占用系统RAM。
此行为会导致某些用户使用任务杀手攻击您,例如从最近任务列表中滑动您的应用。这将终止您的流程,因此您的Timer
也会消失。同样,由于太多草率开发人员长时间保持Service
左右,Android会在一段时间后自动终止此类流程,Service
尽管如此。
最后,通常“以一定间隔检查服务器更新”的一个方面是,即使设备进入睡眠模式,您也希望进行此项工作。使用永久服务方法,需要使用WakeLock
始终保持CPU开启状态。这将显着影响用户的电池,导致您的应用程序出现在“设置”应用的“电池责任屏幕”上。结合捆绑系统RAM“功能”,可能会对您的应用程序产生一些不良评级。
相反,使用AlarmManager
:
您的IntentService
只需要在它正在工作时运行(“检查服务器更新”),在这些事件之间消失,这样您的进程就可以终止以释放系统RAM对于用户正在做的其他事情
通过使用WakefulBroadcastReceiver
或WakefulIntentService
模式,您可以短暂唤醒设备以执行此项工作,然后让设备重新进入休眠状态,从而最大限度地减少对设备的影响电池