绑定服务

绑定服务

1.继承Service  

  绑定服务是 Service 类的实现,不是IntentService实现。

2.bindService

  客户端可通过调用 bindService() 绑定到服务,bindService() 方法会立即无值返回,但当系统创建客户端与服务之间的连接时,会对 ServiceConnection 调用 onServiceConnected(),向客户端传递用来与服务通信的 IBinder。

3. onBind()只一次。

  只有在第一个客户端绑定时,系统才会调用服务的 onBind() 方法来检索 IBinder。系统随后无需再次调用 onBind(),便可将同一 IBinder 传递至任何其他绑定的客户端。

4.定义服务的 IBinder 接口的3种方案

  • 扩展 Binder 类:直接调用方法。同进程内。
  • 使用 Messenger:注意:只是简单传递消息,并不是调用方法。

  这是执行进程间通信 (IPC) 的最简单方法,Messenger 会在单一线程中创建包含所有客户端请求的队列,以便服务一次接收一个请求。这样您就不必对服务进行线程安全设计。
  注意,是在单一线程中处理所有请求。这点与IntentService相似,但是IntentService是启动式服务,而Messenger是绑定式服务。

  • AIDL:

    如果您想让服务同时处理多个请求,则可直接使用 AIDL。 在此情况下,您的服务必须具备多线程处理能力,并采用线程安全式设计。

5.Messenger与aidl比较

  当您需要执行 IPC 时,为您的接口使用 Messenger 要比使用 AIDL 实现它更加简单,因为 Messenger 会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。
  对于大多数应用,服务不需要执行多线程处理,因此使用 Messenger 可让服务一次处理一个调用。如果您的服务必须执行多线程处理,则应使用 AIDL 来定义接口。

6.扩展 Binder 类实现绑定服务

  创建一个满足下列任一要求的 Binder,在在onBind返回就可:

  • a.包含客户端可调用的公共方法
  • b.返回当前 Service 实例,其中包含客户端可调用的公共方法
  • c.或返回由服务承载的其他类的实例,其中包含客户端可调用的公共方法

7.使用 Messenger实现绑定服务

  再次强调:只是简单传递消息,并不是跨进程调用方法。
  服务端:

  • a.创建一个handler,这个handler在服务中处理来自客户的message。
  • b.构造Messenger 对象,它需要用上一步创建的handler。
  • c.在onbind中返回mMessenger.getBinder();

  客户端

  • d.在ServiceConnection的onServiceConnected中构造Messenger对象
  • e.使用上步构造的Messenger对象发送消息,mMessenger.send(msg);

8.关于Messenger示例

  注意:官方文档示例中并未说明服务如何对客户端作出响应。如果您想让服务作出响应,则还需要在客户端中创建一个 Messenger。然后,当客户端收到 onServiceConnected() 回调时,会向服务发送一条 Message,并在其 send() 方法的 replyTo 参数中包含客户端的 Messenger。
  https://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html
  https://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.html

9.本文档最重要一条

  注:只有 Activity、服务和内容提供程序可以绑定到服务 — 您无法从广播接收器绑定到服务。

10.关于ServiceConnection

  • onServiceConnected() 系统会调用该方法以传递服务的 onBind() 方法返回的 IBinder
  • onServiceDisconnected() 系统会在与服务的连接意外中断时(例如当服务崩溃或被终止时)调用该方法。当客户端取消绑定时,系统“不会”调用该方法。

11.bindService()

  • 第一个参数是一个 Intent,用于显式命名要绑定的服务(注意:虽然不推荐但 Intent 有可能是隐式的)
  • 第二个参数是 ServiceConnection 对象
  • 第三个参数是一个指示绑定选项的标志。它通常应该是 BIND_AUTO_CREATE,以便创建尚未激活的服务。其他可能的值为 BIND_DEBUG_UNBIND 和 BIND_NOT_FOREGROUND,或 0(表示无)
  • 应该始终捕获 DeadObjectException 异常,它们是在连接中断时引发的。这是远程方法引发的唯一异常

12.管理绑定服务的生命周期

 

posted @ 2017-06-15 14:54  f9q  阅读(254)  评论(0编辑  收藏  举报