android的线程(Thread)和服务(Service)的区别

1.服务不是单一的进程。服务没有自己的进程,应用程序可以不同,服务运行在相同的进程中。

2.服务不是线程。可以在线程中工作。

一.在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。

同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。

二.如果任务占用CPU时间多,资源大的情况下,要使用线程。

 

Service其实就是一个没有界面的Activity,因此不能做长时间阻塞,ThreadService可以做阻塞,因为它是异步的。
Thread不能更新UI因为他自己本身已经脱离了UI线程,不存在Handler以及Message队列,但是Service系统会像Activity一样,将其绑定到UI线程上

二、Service的分类

对一个安卓服务(Android Service)来说,通常是要么将其作为已启动的服务(Started Service),要么将其作为已被绑定的服务(Bound Service)。

1、Started Service

已启动的服务(Started Service)是指被同一个应用程序的某个对象显式启动,或者在设备引导时就启动了(配置了服务的情况)。通常情况下,已启动的服务在操作系统或服务自身显式调用停止服务之前一直在运行。

2、Bound Service

被绑定的服务(Bound Service)提供直接链接到应用程序中特定的Service。它使用一个Binder提供对Service的引用,这样一来,应用程序就可以直接访问Service中的成员了。一般在同一个应用程序(通常是一个Activity)中的客户端启动时绑定到该Service,导致Android启动该服务,在客户端连接或绑定到它以后,安卓系统会保持被绑定的服务一直运行。当所有客户端断开连接或取消绑定时,Android才会停止该服务。

3、Hybrid Service

也可以将Started Service和Bound Service这两种服务混合在一起,称为混合式服务(Hybrid Service)。即:先显式启动某个服务,然后再绑定到该服务。这种方式的好处是也给别的应用程序提供了一个利用服务做其他事情的机会。换句话说,只要别的应用程序连接到该服务,就可以直接访问它。

混合式服务的办法非常有用,使用也非常普遍。比如说,我们正在编写一个在徒步旅行时跟踪运动位置的应用程序,我们可能想要不断地记录位置以便以后使用,但仅在需要屏幕显示时才去显示特定的位置信息。在这种情况下,当应用程序运行时,仅仅在客户端某一个Activity在前台运行的时候才可能会启动这个服务。该Activity绑定到该服务以后,就可以获取位置信息,但是,即使该Activity取消和这个服务的绑定,该服务仍能继续运行。换言之,混合服务(Hybrid Service)一旦启动起来就会一直运行,直到它被显式停止和没有客户端绑定到它才会关闭它,或者直到系统因为内存不够用时才会关闭它。

三、使用服务还是使用线程

如果你需要在主线程之外执行一些工作,但仅当用户与你的应用程序交互时才会用到它,那你应该创建一个新的线程而不是创建一个服务。比如,如果你需要播放音乐,但只是当你的activity在运行时才需要播放,此时可以在OnCreate()中创建一个线程,在OnStart()中开始运行,在OnStop()中终止运行。还可以考虑使用AsyncTask或HandlerThread来取代传统的Thread类。

要始终记住:

(1)如果你使用了服务,它默认运行在应用程序的主线程中。因此,如果服务执行的是密集计算型的工作,那么它可能会阻塞界面操作,这种情况下,你仍然应该在服务中创建一个新的线程来完成这些工作。

(2)创建自定义的服务时,必须新建一个继承自Service的类或其子类。另外,在实现代码中,还需要重写一些回调方法,这些回调方法用于对服务生命周期中的关键节点进行处理,以及向组件提供绑定机制。

这里再强调一遍,在Android系统中,服务仅仅是一个组件,即使用户不再与你的应用程序发生交互,它可能仍然能在后台运行着。因此,应该只在需要时才创建一个服务。

Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work. By using a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the application's main thread can remain dedicated to user interaction with your activities.

service是运行在主线程上的,而不是运行在另一个线程中,如果你想在service中处理很占时间的操作,你必须在service中开线程,这样可以降低activity没有响应的风险。

 

 

Should you use a service or a thread?

 

A service is simply a component that can run in the background even when the user is not interacting with your application. Thus, you should create a service only if that is what you need.

If you need to perform work outside your main thread, but only while the user is interacting with your application, then you should probably instead create a new thread and not a service. For example, if you want to play some music, but only while your activity is running, you might create a thread inonCreate(), start running it in onStart(), then stop it in onStop(). Also consider using AsyncTask orHandlerThread, instead of the traditional Threadclass. See the Processes and Threading document for more information about threads.

Remember that if you do use a service, it still runs in your application's main thread by default, so you should still create a new thread within the service if it performs intensive or blocking operations.

很多时候,你可能会问,为什么要用 Service,而不用 Thread 呢,因为用 Thread 是很方便的,比起 Service 也方便多了,下面我详细的来解释一下。

 

1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。

2). Service:Service 是Android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!

  

既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。

  

举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。

  

因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。

posted on 2016-07-24 02:01  oyl  阅读(1050)  评论(0)    收藏  举报

导航