【发布时间】:2010-06-15 13:25:17
【问题描述】:
我试图了解IntentService 的用途,我应该什么时候使用它?
我试图从 API 中理解,但没有足够的细节。
这和在工作线程上运行长任务有什么类比吗?
非常欢迎任何关于我为什么要使用IntentService 的进一步解释和示例。
谢谢,
射线。
【问题讨论】:
我试图了解IntentService 的用途,我应该什么时候使用它?
我试图从 API 中理解,但没有足够的细节。
这和在工作线程上运行长任务有什么类比吗?
非常欢迎任何关于我为什么要使用IntentService 的进一步解释和示例。
谢谢,
射线。
【问题讨论】:
这和这有什么类比吗 在工作线程上运行长任务?
IntentService 为您处理线程。
我应该什么时候使用它?
一些用例:
AlarmManager触发的警报
BroadcastReceiver 捕获的其他事件
【讨论】:
IntentService 作为我所有网络相关任务的线程管理器,而不是上面提到的几点吗?
Android 服务是平台的主力。它们允许应用程序运行长时间运行的任务并为外部应用程序提供功能。不幸的是,由于它们在后台运行并且对开发人员来说视觉上并不明显,因此它们可能是一个令人头疼的问题。如果您看到 ANR(活动无响应)或想知道为什么服务在不应该运行的情况下运行,则可能是服务实施不善。
可怕的 ANR 让我们看一下服务导致的两个主要错误: ANR。这些破坏了用户的体验并为用户提供了强制关闭的选项。这可能会导致用户卸载您的应用程序或后台进程处于中断状态。这样做的原因是服务是从您的调用线程启动的——通常这是 UI 线程。 始终运行服务。尽管 Android 提供了调度和停止服务的机制,但并非所有开发人员都遵循这些准则。事实上,我见过的很多例子甚至都没有提到停止你的服务。这可能会导致整体性能下降、用户混乱和电池消耗。 我想 Google 的 Android 开发人员看到这已成为一个问题,并在 Android 1.5 中引入了 IntentService 类。 IntentService 类解决了上述问题,并抽象了开发人员对线程和服务停止的所有管理。这是从应用程序的主线程卸载任务的非常简单而强大的方法。
【讨论】:
每当用例是一项需要很长时间但有规律结束的特定任务时,我都会使用它。例如,上面拼写的用例以及诸如以下的常规任务: -同步 - 下载资源 - 从各种来源提取数据并存储它们
当服务在本质上长时间运行并且没有明确的结束时,我不建议使用它。我已经看到这样做了,这是一个错误,因为人们最终绕过 IntentService 自行停止这一事实的方式是创建锁以防止 handleIntent 完成,或者如果他们不想阻止下一个请求排队,他们将通过再次向自己发送 startService 来重新启动自己。这太可怕了,对于这些类型的场景,您应该只使用一个长时间运行的常规 Android 服务,并确保它绑定到(可能是 AUTO_CREATE)并在主线程之外处理工作。
【讨论】: