为什么要使用服务,如果它运行在android中的同一个线程

我正在通过android开发人员网站的绑定服务 。 我以为我足够了解服务,但我只是find了通过使用Messenger类连接服务的另一种方式,特别是本地服务。 在那里我感到困惑。 也许我弄错了这个概念。

这里是我对Android服务的理解。 您在创build服务时

  1. 你想在后台做单独的工作。
  2. 你想让它分开的过程。
  3. 你想让它运行在不同的生命周期。

混乱是列表中的第一项,即背景的定义。 不是背景是线程还是进程? 我从来没有想过它可以在主线程上运行。

这里是在开发页面的服务谨慎。

注意 :服务运行在其宿主进程的主线程中 – 服务不会创build自己的线程,也不会在单独的进程中运行(除非另有指定)。 这意味着,如果你的服务要做CPU密集的工作或阻塞操作(如MP3播放或networking连接),你应该在服务中创build一个新的线程来完成这个工作。 通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动进行交互。

问题1.如果服务函数无论如何都会在主线程上运行,为什么select使用服务? 2.即使耗时的工作在主线程中完成,我们是否必须写一个服务来阻塞ANR? 假设该服务仅适用于我的应用程序。 3.是否有任何实际的情况或原因使用服务作为私人和运行在同一个线程?

提前致谢。

Solutions Collecting From Web of "为什么要使用服务,如果它运行在android中的同一个线程"

应用程序主线程并不总是UI线程。 例如,当活动停止时,onStop()被调用,因此UI线程被从该活动中移走并移动到相同或不同应用程序中的另一个活动。 但是,这并不意味着应用程序不再处于活动状态,它可以继续在后台工作,直到它被操作系统或用户closures。 那么谁让它在后台运行? 这是主线程而不是UI线程。

什么是服务

在Android中,Service是一个应用程序组件,可以在UI线程的后台执行长时间运行的操作。 通过背景,这意味着它没有用户界面。 服务默认在调用Component的进程的主线程上运行(因此可能会降低响应速度并导致ANR),因此应该创build一个新线程来执行长时间运行的操作。 服务也可以在完全不同的过程中运行。

与活动组件不同,服务没有任何graphics界面。 此外,广播接收器用于接收广播消息(广播,多播,单播)并执行短期任务,而服务则用于执行像stream式音乐,networking事务,文件I / O,与数据库交互等冗长的处理。当服务启动时通过应用程序组件(如Activity)在后台运行,并且即使用户切换到另一个应用程序或启动组件本身被破坏

为什么使用服务

服务被赋予比其他后台进程更高的优先级,因此Android不太可能终止它。 虽然可以configuration为在有足够的可用资源时重新启动。 您应该在stream程和线程的文档中查看不同的stream程及其优先级/重要级别。 将它们分配给与前台活动相同的优先级是绝对有可能的,在这种情况下,它需要有一个可见的通知活动(通常用于服务播放音乐)。

如果您不想自行pipe理线程,请使用IntentService。 否则使用AsyncTasks。

请阅读这个优秀的文章,以更详细地了解 ,也阅读这个答案 。

简而言之,服务在UI线程的背景下运行。 您可以执行诸如客户端 – 服务器身份validation之类的任务,或者在没有graphics界面的情况下写入任务在后台完成的数据库。

但是,如果您正在执行可能会冻结接口的非常长的处理任务,则可以在单独的线程上使用服务。

例如一个独立线程上的服务是IntentService