【问题标题】:How to create a service that runs in the background and performs async tasks in Android如何创建在后台运行并在 Android 中执行异步任务的服务
【发布时间】:2014-11-20 17:51:53
【问题描述】:

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

我正在尝试创建一个可以下载、验证和安装 APK 的管理器类。

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

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

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

我已经阅读了 Service 和 Intent Service 的内容,虽然文档清楚地表明 Intent Services 是在应该在 UI 线程之外完成处理时使用的,但是我访问的几乎每个论坛都说你不应该这样做IntentService 中的异步工作。

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

【问题讨论】:

  • 阅读未绑定服务。

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


【解决方案1】:

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

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

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

根据您的描述,您可能有两个选择:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 2014-03-31
    • 2018-10-18
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多