Android服务是否从一个独立的线程而不是UI运行?

Android服务是否从一个独立的线程而不是UI运行?,android,multithreading,service,Android,Multithreading,Service,我目前正在使用alarmmanager启动一项将位置发布到http的服务。问题是,当管理器启动并运行服务时,ui似乎会停止一段时间。我想问一下,服务线程是否与ui线程分离 从Android文档复制: 警告:服务在其宿主进程的主线程中运行 服务不创建自己的线程,也不在单独的线程中运行 过程(除非您另有规定)。这意味着,如果 服务将执行任何CPU密集型工作或阻塞操作 (如MP3播放或网络),您应该创建一个新线程 在服务范围内完成该工作。通过使用单独的线程,您可以 将降低应用程序不响应(ANR)错误和

我目前正在使用alarmmanager启动一项将位置发布到http的服务。问题是,当管理器启动并运行服务时,ui似乎会停止一段时间。我想问一下,服务线程是否与ui线程分离

从Android文档复制:

警告:服务在其宿主进程的主线程中运行 服务不创建自己的线程,也不在单独的线程中运行 过程(除非您另有规定)。这意味着,如果 服务将执行任何CPU密集型工作或阻塞操作 (如MP3播放或网络),您应该创建一个新线程 在服务范围内完成该工作。通过使用单独的线程,您可以 将降低应用程序不响应(ANR)错误和 应用程序的主线程可以保持专用于用户交互 与你的活动


如果您不想自己管理线程,请使用
IntentService
。或者使用android开发者提供的
异步任务

什么是服务

关于服务类的大多数困惑实际上围绕着它不是什么:

服务不是一个单独的进程。服务对象本身并不意味着它正在自己的进程中运行;除非另有规定,否则它与它所属的应用程序在同一进程中运行。 服务不是线程。它本身并不是一种脱离主线程工作的方法(以避免应用程序不响应错误)。 因此,服务本身实际上非常简单,提供了两个主要特性:

应用程序告诉系统它想在后台做什么的工具(即使用户没有直接与应用程序交互)。这对应于对Context.startService()的调用,该调用要求系统安排服务的工作,直到服务或其他人明确停止服务为止。 应用程序向其他应用程序公开其某些功能的工具。这对应于对Context.bindService()的调用,该调用允许与服务建立长期连接,以便与服务交互。 当实际创建服务组件时,出于上述任一原因,系统实际上只需实例化该组件并调用其onCreate()和主线程上的任何其他适当回调。由服务通过适当的行为来实现这些功能,例如创建一个辅助线程来执行其工作


请注意,由于服务本身非常简单,您可以根据需要使与它的交互变得简单或复杂:将其视为直接调用方法的本地Java对象(如本地服务示例所示),使用AIDL提供完整的可远程接口。

澄清:应用程序的主线程并不总是UI线程。 例如:如果某个活动停止,将调用onStop(),因此UI线程将从该活动中移除,并移动到同一个或不同应用程序中的另一个活动

但是,这并不意味着此应用程序不再处于活动状态。此外,如果有一个(已启动的)服务在后台运行,它可能会继续运行一段时间,直到它终止,或者Android操作系统由于缺乏资源而终止它

在此期间谁运行此服务?谁触发onStop()或onDestroy()?这是应用程序的主线程执行的

UI线程是一种单线程。一次只能由一个可见的活动使用。要么应用程序的主线程加入/附加到UI线程,要么另一个线程获得它。然而,这并不意味着应用程序没有自己的主线程

这种行为来自Android系统的Linux \UNIX基金会。大多数开发人员不知道的是:应用程序是Linux\Unix操作系统中的“用户”

无论何时调用应用程序,都类似于用户登录系统。在应用程序中,用户id是唯一的应用程序id,而不需要密码。新登录的“用户”(即Android应用程序)获得一个进程和资源,例如Java虚拟机的实例。该进程专用于该用户,包括文件系统配额、文件描述符和处理程序在内的资源允许该用户与操作系统通信

android应用程序的主线程是根线程,它是在android操作系统移交给该应用程序的过程中创建的。在此应用程序中创建的任何新线程都将始终返回主线程

应用程序的主线程可以访问的系统资源之一是UI线程。因此,应用程序可以请求主线程,但请求可能被拒绝(或批准)。例如:如果应用程序进程超出了允许的内存分配大小,Android操作系统可能会决定拒绝访问UI线程,甚至破坏应用程序并终止进程


通过AndroidManifest.xml中的定义,可以为应用程序(Unix process fork)定义多个进程。但是,请记住,分配给每个进程的资源是不同的,即每个进程都有自己的VM,因此,在不同进程中维护的对象将无法通过同一JVM堆共享信息。

您可能应该查看@ericlee Late reply:查看此示例IntentService在这种情况下可能比服务更好。以前从未知道过这一点……我一直认为应用程序主线程是UI线程……有点困惑-这里:谷歌声明:“每当你第一次启动Android应用程序时,一个名为“main”的线程就会自动创建。主线程,也称为UI线程[…]”听起来