四大组件之Service 第2节 Start Service和Bind Service

更新时间 修改意见
2016-08-02 陈敏

第2节 Start Service和Bind Service

我们先从触发Service运行的角度来认识Service,有了整体的认识之后,我们再来看看远程Service和本地Service。

2.1 Start Service

其他组件通过调用startService()函数将Service运行起来,再通过调用stopService()函数让其停止运行。

单纯的使用这种形式的Service最为简单,它和它的调用者之间没有什么联系,调用者只是负责启动它和停止它,或者在启动它的时候通过Intent传递一点数据,除此之外,两者没有数据交换、没有其他的功能调用,这两个组件之间基本上互不影响。

设计这样的一个Service需要,

  1. 继承Android SDK提供的Service类,重写onBind()函数,让它返回空值;

  2. AndroidManifest.xml中,声明新创建的Service

使用这种Service也很简单。假设Activity A中有个按钮start,点击之后就调用startService;还有个按钮B-stop,点击之后就调用stopService

这里运行Service的时候,是通过Intent明确指定被运行的Service。这种明确指定启动哪个Service的方式叫做Service的显示调用。与之对应的还有隐式调用。我们稍后来详细介绍。

2.2 Bind Service

其他组件通过调用bindService()绑定Service,让它运行起来;再通过调用unbindService()解除绑定。

这种形式的Service与调用者之间通常有功能调用或者频繁的数据交换,调用者会向Service发出请求让Service进行特定的操作,并返回结果。

设计这样的一个Service需要,

  1. 继承Android SDK提供的Service类,

  2. 实现一个自定义的Binder,让它这个继承Binder类。

    Binder可以将Service与调用者联系起来,在Binder中提供的方法,就是Service对外提供的方法。

    组件和Service之间的调用是通过Binder来进行的。我们可以把Binder看作是一个连接其他组件和Service的桥梁,它的实现原理是什么,我们暂时不用去关心,只要知道这样用就可以了。

  3. AndroidManifest.xml中,声明新创建的Service

其他组件使用这个Service的时候,

  1. 创建一个ServiceConnection,当绑定Service之后,在onServiceConnected()中会得到Service返回的Binder;如果Service遇到异常情况退出时,会通过onServiceDisconnected()通知绑定它的组件。

    获得了MyService.MyServiceIBinder之后,我们就可以向调用普通函数那样,调用到Service对外提供的接口函数了。

    需要注意的是,如果用户主动解除绑定,onServiceDisconnected()是不会被触发的。

  2. 假设Activity A中有个按钮,点击之后就调用bindService;还有个按钮B,点击之后就调用unbindService

    这里同样采用的是对Service的显示调用。

2.3 混合模式

Service并不是只能给一个组件使用,它可以同时服务于多个组件。
所以一个Service既可以是Start Service,也可以是Bind Service。只要把两者需要实现的地方都实现了就行。组件A可以通过startService()运行一个Service,组件B可以通过bindService()再次运行同一个Service

2.4 显式调用和隐式调用

Activity一样,Service有两种被调用的方式,显式调用和隐式调用。

2.4.1 显式调用

通过Intent明确的指定要运行哪个Service,这就是显式调用。
就好像给指定的个人发货,写下接收方具体的名字和地址。

设计显式调用,

通常,应用中的组件启动自己应用中的Service,可以采用这样的方式,

2.4.2 隐式调用

如果是应用A的组件要使用应用B的Service,通常会使用到隐式调用,不明确的告知要启动的Service是什么,而是通过IntentAction Name让操作系统自己匹配最合适的响应者。

就好像给某个机构发货,只需要发送给某个机构,但不需要知道这个机构中具体是哪个人。

设计隐式调用,

  1. AndroidManifest.xml文件中为这个Service指定一个过滤器,为过滤器指定一个Action name

  2. 应用A的组件,要使用这个Service的时候,就可以,

注意,对于Android5.0版本的以上的系统上要设置Intent发送目标的包名。因为从Android5.0开始,不允许隐式启动Service了。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/