3

我有一个IntentService从服务器下载数据的设备,我希望IntentService每隔一段时间检查服务器更新。但是,以下帖子建议不要重复Service使用 a Timer- 而是强调使用 a AlarmManager

为什么我的服务在 Android 中不起作用?(我只想每 5 秒记录一次)

Android - 服务:只重复一次

Android 服务停止

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

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

这种“工作队列处理器”模式通常用于从应用程序的主线程卸载任务。IntentService 类的存在是为了简化这种模式并处理机制。要使用它,请扩展 IntentService 并实现 onHandleIntent(Intent)。IntentService 将接收 Intent,启动工作线程,并酌情停止服务。

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

我不太明白的部分是为什么 a IntentService(帖子有针对 aService而不是 a 的问题IntentService)不允许使用 Timer 重复执行,因为它创建了自己的工作线程来执行。是否允许在 aTimer中使用 a IntentService?或者是AlarmManagers定期执行的唯一解决方案IntentService

对此的解释将不胜感激。

4

1 回答 1

8

还是 AlarmManagers 是定期执行 IntentService 的唯一解决方案?

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

首先,除了主动向用户交付价值时,不要运行Service任何形式的。观察时钟滴答声并没有积极地为用户提供价值。在终止哪些进程以释放系统 RAM 以供将来工作方面,运行使您的进程比其他进程具有更高的优先级。由于不必要地占用了系统 RAM,因此不必要地进行操作(例如简单地观察时钟滴答声)会妨碍用户进行多任务处理的能力。ServiceService

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

最后,“以特定间隔检查服务器更新”的一个方面通常是,即使设备进入睡眠模式,您也希望这项工作发生。使用您的永久服务方法,这将要求您始终保持 CPU 开启,使用WakeLock. 这会显着影响用户的电池,导致您的应用出现在设置应用的“电池指责屏幕”上。这与 tying-up-system-RAM “功能”相结合,可能会导致您的应用程序评分不佳。

相反,通过使用AlarmManager

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

  • 通过使用WakefulBroadcastReceiverorWakefulIntentService模式,您可以短暂唤醒设备来完成这项工作,然后让设备再次进入睡眠状态,从而最大限度地减少对电池的影响

于 2014-06-16T11:02:02.977 回答