0

我相当确定使用 Service 和 AsyncTask 处理异步文件下载是标准做法。这样,您可以终止原始活动并继续您的快乐方式。但是,当您不需要 Service 的生命周期管理、远程进程通信或其他主要功能时,这似乎有点矫枉过正。

既然服务仍然是整个应用程序的同一进程和生命周期的一部分,为什么不简单地在应用程序的上下文中运行一个后台线程(与活动相比,尽管不一定在扩展的应用程序类中)?有什么理由说明这将是一个特别糟糕的主意吗?

4

1 回答 1

1

我相当确定使用 Service 和 AsyncTask 处理异步文件下载是标准做法。

AnAsyncTask在 a 中是无用的Service,因为您没有理由在 a 中的主应用程序线程上做任何事情Service。使用 anIntentService进行下载,因为它为您提供了一个后台线程,并且在没有更多工作要做时自动停止。

为什么不简单地在应用程序的上下文中运行一个后台线程......有什么理由说明这将是一个特别糟糕的主意吗?

因为您的应用程序将不可靠。

虽然很多人关注服务的独立生命周期,但这并不是您将服务用于此类事情的原因。您将服务用作操作系统的标志,表明您的进程仍在执行某些操作。

一旦您不再处于前台,Android 可以随时随意终止您的进程。特别是如果内存压力很大,这可能在您的应用程序离开前台的几毫秒内。

但是,Android 通常优先于终止空进程(没有正在运行的活动或服务的进程)和仅活动进程,优先于包含正在运行的服务的进程。在这里,“一般”意味着带有服务的进程不会永远存在,但它们被快速终止的可能性要小得多。

因此,使用IntentServiceis 向操作系统发出信号,表明您仍在向用户交付价值(下载文件),并且它应该让您的进程保持独立,直到您IntentService停止(因为下载完成)或您的服务运行时间过长以至于它可能失去了它的虚拟弹珠。

一个Application不是一个。_ Service每个进程都有一个Application实例。由 an “管理” 下载Application是没有意义的——您不妨在任何Context. 而且,最重要的是,没有任何东西可以告诉操作系统您正在做任何有意义的事情,因此您的进程可以在您离开前台后立即终止。

但是,当您不需要 Service 的生命周期管理、远程进程通信或其他主要功能时,这似乎有点矫枉过正。

IntentService在清单条目之外编写一个 并不比编写一个 复杂得多AsyncTask。调用 anIntentService并不比调用 an 复杂得多AsyncTask

于 2013-11-14T00:22:57.520 回答