Android服务是从单独的线程而不是UI运行的吗?

我目前正在使用一个警报pipe理器来启动一个向http发送位置的服务。 问题是,当经理启动和运行的服务,似乎停止了一段时间。 我会问,如果服务线程是从UI线程分离?

Solutions Collecting From Web of "Android服务是从单独的线程而不是UI运行的吗?"

从Android文档复制:

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

http://developer.android.com/guide/topics/fundamentals/services.html

使用IntentService如果你不想自己动手pipe理线程。 或者使用AsyncTasks。

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

但是 ,这并不意味着这个应用程序不再有效。 此外,如果在后台运行(启动)服务,可能会持续一段时间,直到终止,或者由于资源不足,Android OS终止。

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

UI线程是一种Singleton。 它一次只能被一个可见的活动使用。 应用程序的主线程被连接/附加到UI线程或者另一个获取它。 但是,这并不意味着应用程序没有自己的主线程。

这个行为来自Android系统的Linux \ Unix基础。 大多数开发人员没有意识到:应用程序是Linux \ Unix操作系统中的“用户”。

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

Android应用程序的主线程是根据Android操作系统交给该应用程序的进程创build的根线程。 在此应用程序中创build的任何新线程将始终返回到主线程。

UI线程是应用程序主线程可以访问的系统资源之一。 因此,应用程序可以请求主线程,但是请求可能被拒绝(或授予)。 一个例子:如果应用程序进程超出了允许的内存分配大小,Android OS可能决定拒绝对UI线程的访问,甚至销毁应用程序并终止进程。

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

来自android开发者:

什么是服务?

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

服务不是一个单独的过程。 服务对象本身并不意味着它在自己的进程中运行; 除非另有说明,它运行在与它所属的应用程序相同的进程中。 服务不是一个线程。 这不是一个方法本身做主线程的工作(以避免应用程序不响应错误)。 因此服务本身其实非常简单,提供了两个主要function:

一个应用程序的工具,告诉系统它想要在后台做什么(即使用户没有直接与应用程序交互)。 这对应于对Context.startService()的调用,它要求系统调度服务的工作,直到服务或其他人明确地停止服务。 一个应用程序的工具,以将其一些function暴露给其他应用程序。 这与对Context.bindService()的调用相对应,这允许与服务进行长期连接以与其进行交互。 当实际创build一个Service组件时,出于以上任何一种原因,系统实际上所做的就是实例化组件,并在主线程上调用onCreate()和其他任何适当的callback函数。 由服务实施这些与适当的行为,如创build一个辅助线程,它在其中工作。

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