Android 意向服务及其优势

Android 意向服务及其优势,android,Android,任何人都可以分享使用IntentService而不是AsycTask或线程或甚至服务和线程的真正优势吗?服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行更长时间的运行操作,或提供供其他应用程序使用的功能。每个服务类必须在其包的AndroidManifest.xml中有相应的声明。可以使用Context.startService()和Context.bindService()启动服务 请注意,与其他应用程序对象一样,服务在其宿主进程的主线程中运行。这意味着,如果您的服务要执行任何

任何人都可以分享使用
IntentService
而不是
AsycTask
或线程或甚至服务和线程的真正优势吗?

服务是一个应用程序组件,表示应用程序希望在不与用户交互的情况下执行更长时间的运行操作,或提供供其他应用程序使用的功能。每个服务类必须在其包的AndroidManifest.xml中有相应的声明。可以使用Context.startService()和Context.bindService()启动服务

请注意,与其他应用程序对象一样,服务在其宿主进程的主线程中运行。这意味着,如果您的服务要执行任何CPU密集型(如MP3播放)或阻塞(如网络)操作,它应该生成自己的线程来执行该工作。有关这方面的更多信息可以在进程和线程中找到。IntentService类是一个标准的服务实现,它有自己的线程,可以在其中安排要完成的工作

AsyncTask允许正确且轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序

AsyncTask被设计成一个围绕线程和处理程序的助手类,并不构成通用线程框架。AsyncTasks最好用于短期操作(最多几秒钟)。如果您需要让线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,如Executor、ThreadPoolExecutor和FutureTask


异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种通用类型(称为参数、进度和结果)和4个步骤(称为onPreExecute、doInBackground、onProgressUpdate和onPostExecute)定义。

Intent Service 没有与主线程的通信。在工作线程上运行。没有并行任务。所有请求都在单个工作线程上处理

线程 独立运行。多线程并行处理

服务 在没有UI的主线程中运行。长时间运行的进程块主线程。对长时间运行的进程使用服务内的线程

异步任务 长时间运行的进程通信回主线程。在工作线程中运行


在决定在实现中使用哪一个之前,您必须知道每个服务的确切用途。

服务可以在后台运行,即使用户没有与您的应用程序交互。如果这是您的场景,请使用服务。如果您不需要在主线程中执行某些工作,而只需要在用户与应用程序交互时执行,请使用
Thread
。典型的例子是在活动运行时播放音乐,而不是创建线程
AsyncTask
只是线程的助手类


服务正在应用程序的主线程中运行,因此,如果您正在执行某些阻塞操作,您仍然必须在服务中创建一个新线程,或者使用已为您创建的
IntentService
IntentService
只是一个带有工作线程的服务。

使用IntentService有几个主要优点

  • 易于实现。它只有一个需要重写的方法
  • 易于将数据传递到。您只需使用intent extras机制
  • 在你的应用程序中随处可见。它在manifest.xml中注册
  • 处理多个意图。这些文件排队并按顺序执行
  • 自我终止。处理队列中的意图后,服务停止

这些优点结合在一起,使得IntentService机制既方便又强大。

我看到很多关于常规服务而不是IntentService的讨论。我现在正在研究两者之间的区别,主要是要并行运行一堆东西(AsyncTask),还是要生成一个具有队列的工作线程。AsyncTask似乎确实与活动相关,而IntentService似乎独立于活动运行

如果您曾经在活动之间进行过捆绑,并且处理过回调系统,那么IntentService将变得非常简单。请随意谈论异步任务


我的大多数设计倾向于喜欢IntentService的排队方面。如果您使用的资源大部分是独立于UI线程运行的,并且希望避免像单线程CPU那样对资源进行重击,这一点尤其好。

我需要知道使用intentservice而不是asyctask或线程的真正优势。asynctask和serviceIntent服务的定义不能在后台运行,独立于您的应用程序。假设在活动上运行Asynctask以下载大量数据,因此您必须在该特定屏幕上等待,直到下载完成。这意味着您不能在下载完成之前离开该屏幕,但如果您在Service Class+Asynctask上下载了大量数据,则您可以在应用程序中导航独立于您的服务工作。这就像是多任务。我的应用程序中有一个用例,我想根据用户请求下载不同的文件,但下载速度应该很快,所以我必须进行并行下载。而且,如果用户退出应用程序,已经启动的下载必须继续。在这种情况下,什么是更好的选择线程或多意图服务对于每一个下载请求(我认为这不是一个好方法),Android文档都说明AsyncTasks的使用时间不应超过几秒钟。。。我不会像你说的那样称之为“长时间运行的过程”。