Android Service介绍(Service与线程关系)

来源:互联网 发布:淘宝代付不能用花呗吗 编辑:程序博客网 时间:2024/04/30 11:49

Service是一个应用程序组件,它能够在台后执行一些比较耗时的操作,但是却不提供用户界面。Service能够被其他应用程序的组件启动,同时即使用户切换到另外的应用时它还能保持在后台一直运行。另外,应用程序组件还能与服务绑定,并与服务进行交互,甚至能够进行进程间的通信(IPC),例如,Service可以进行网络传输,执行文I/O处理以及和content provider进行交互等,这些所有都是在后台进行的。

Service分有两种基本类型:

1、Started:当一个应用程序组件通过startService()来启动Service,该Service便被启动了,Service一旦被启动了,就会一直在后台运行下去,即使启动它的应用程序已经被销毁,它依然能够保持后台运行。一般情况下,通过Started启动的Service只执行单一的操作,并且它不会向调用者反回结果。如网络上传或下载,所以当操作完成后,一般要将其终止。

2、Bound:如果一个应用程序通过bindService()启动Service时,该Service就是被“bound”了,bound Service提供了一个客户端/服务器接口,允许组件与Service进行交互、发送请求、获取结果甚至可以利用进程间通信(IPC)跨进程执行这些操作,绑定Service的生存期和被绑定的应用一致,另外,多个组件可以同时与一个Service进行绑定,但是当所有的组件与Service解绑后,Service也会随之被销毁。


Service与线程间的关系:

1、线程:线程是应用程序中最小的一个单元,它是用来分配cpu的基本单位,可以用线程来执行一些异步的操作。

2、Service是运行在主线程中的,但是它不是一个线程,它也不会自己自动创建线程(除非由你明确的指定)。也就是说如果你要在Service中运行比较耗时的操作或者会出现阻塞的操作时(如上传、下载等),为了减少出现ANR的机率,你必须在Service中创建一个新的线程去执行这些操作。所以Service不是线程,它跟线程半毛钱关系也没有。

另外,为什么要用到Service呢?这个其实跟Android的系统机制有关,先拿线程来说,线程仅运行在一个Activity当中,当一个Activity被finish后,如果在该Activity中没有主动停止线程或者线程里的run方法还没有执行完的话,线程也会一直的执行下去,并没有随Avtivity销毁,所以当一个Activity被销毁后,还在执行的线程操作便不能在别的Activity中进行控制了,但是Service恰好弥补了这一点,它可以被多个组件所进行操控。


何时用线程以及何时用Service:

Service仅仅只是一个应用程度的组件,即使你有没有用到它,有没有进行交互操作,它都会一直在后台运行,所以,应该在需要的时候才创建它。另外,如果你需要在主线程之外进行一些耗时的操作,但是这些操作只会在用户与应用程序进行交互时才会用来(如播放音乐等),那么就不要用Service,应该创建一个新的线程去执行它。另外要记住的是,如果使用了Service,它就会默认的运行在主线程当中,所以,当你要在Service进行一些耗时操作时还必须在Service中创建一条新的线程。

0 0
原创粉丝点击