Service是Android中一种很重要的组件,一般来说有两种用途:用Service执行长期运行的操作,并且与用户没有UI界面的交互;某个应用程序的Service可以被其他应用程序的组件调用以便提供更广泛的使用。要想使得自己写的Service能够正常运行,必须在AndroidManifest.xml中通过标签注册Service,类似于通过标签注册Activity一样。有两种方式使用Service,一种是通过Context类的startService方法启动Service,另一种是通过Context类的bindService方法启动Service。
需要注意的是,与其他的应用程序组件一样,Service默认情况下是运行在其所在宿主进程的主线程中的。也就是说如果我们在Service要做一些CPU密集型操作(比如播放MP3)或阻塞式操作(比如网络请求),那么主线程就会卡死,出现ARN(Application Not Responding)程序无响应现象,为了解决这种问题,我们应该在Service中创建一个新线程,然后将这些耗时操作放入到该新创建的线程中去执行,这样不会阻塞主线程。
为了搞明白Service是什么,我们首先要知道Service不是什么:
a. 首先Service不是另一个独立的进程。 Service不会自己开辟一个新的进程,除非特别指定,默认情况下Service是运行在应用程序所属的进程中。
b. Service不是另一个新线程。Service的操作都是在主线程中执行的,为了避免阻塞主线程,在Service中应该将耗时操作放入到一个新线程中执行。
通过上面的描述我们知道,Service其实很简单(没有开创新的进程和新的线程),Service提供了以下两个主要的特性:
a. 作为应用程序的一部分运行在后台,并且甚至不需要和用户进行交互。这种情况下,我们一般调用Context的startService方法(比如在Activity中调用startSerivce方法)启动service。
b. 作为某个应用程序的组件暴露出去,使得其他的应用程序可以调用该Service。这种情况下,我们一般调用Context的bindService方法,比如我们有两个应用App1和App2,在App1中我们有一个Service叫做App1Service,在App2中我们有一个Acitivity叫做App2Activity,即便App1没有启动,我们在App2的App2Activity中也可以通过调用bindService启动App1中的App1Service,并且通过调用bindService之后,在Service和调用者之间会建立连接进行程序间交互。
后续会写文章分别介绍startService与bindService的使用示例以及生命周期。
版权声明:本文为博主原创文章,未经博主允许不得转载。