如何创建在后台运行并在Android中执行异步任务的服务

时间:2014-09-25 20:17:15

标签: android service apk intentservice android-download-manager

我很难理解何时在Android中使用Service vs IntentService。

我正在尝试创建一个可以下载,验证和安装APK的Manager类。

执行此操作的过程要求我生成一个服务(DownloadManager)来下载文件,这会导致我的服务过早被销毁。

它还需要运行一个活动来安装apk。

这个下载管理器没有前端,我只是希望它是一个后台进程来完成它并以编程方式返回结果。

我已经阅读了Service和Intent Service,尽管文档中明确指出,当处理应该通过UI线程完成时,意图使用Intent Services,但我访问的几乎每个论坛都说你不应该这样做在IntentService中进行异步工作。

例如: Waiting for asynchronous callback in Android's IntentService

1 个答案:

答案 0 :(得分:3)

通常,当您希望一次性离开UI线程执行一个离散任务时,IntentService非常有用。 IntentService将跟踪队列中的每个请求,一次执行一个请求 - 在单独的非UI线程上 - 然后在队列为空时关闭。如果稍后有新请求到达,它将再次启动,然后在队列为空时再次关闭。

关于运行" async"的警告在IntentService内部工作是因为一旦onHandleIntent退出,IntentService认为该项已完成处理。它无法知道您是否创建了另一个您希望它等待的线程。因此,一旦它为所有未完成的请求调用了onHandleIntent,它就会关闭,即使有子线程仍在运行。

无意服务可让您控制服务的启动和停止时间,无论是否有任何工作要做。此外,除非您特别指出,否则服务确实在UI线程上发生了所有事情 - 因此,如果您希望在后台线程上完成工作,则需要明确地实现它。您还可以实现服务处理多个传入请求的方式。但是,服务不会关闭,直到你告诉它(或操作系统耗尽资源)。

这听起来基于你的描述,你可能有两个选择:

  1. 如果您对服务处理请求一次一个,则可以使用IntentService - 但是您需要使onHandleIntent等待每个请求完成。这仍然发生在UI线程之外,但它确实意味着如果您有多个下载请求,它们将不会并行发生。

  2. 您可以使用非意图服务在其自己的子线程上处理每个下载请求,所有这些都是并行的。然后由您来跟踪所有处理线程。