Android bound service 详解二:派生Binder类
如果你的service仅被自己的应用使用并且不需跨进程工作,那么你可以实现你自己的Binder类使得你的客户端能直接使用service的公开接口方法.
注:这只在客户端和service位于同一应用和同一进程中时才能工作,其实大多数都是这种情况.例如,在一个音乐应用需要把它的activity绑定到它自己的播放音乐的后台service时,这种方式就会很好地工作.
下面是如何建立它:
-
在你的service中,创建一个Binder实例,提供以下三种功能之一:
-
Binder包含一些可供客户端调用的公开方法.
-
返回当前的Service实例,它具有一些客户端可以调用的公开方法.
-
或者,返回另一个类的实例,这个类具有客户端可调用的公开方法并托管于service.
-
在回调方法onBind()中返回这个Binder的实例.
-
在客户端,从回调方法onServiceConnected()中接收这个Binder并使用1中所述的公开方法调用绑定service.
注:service和客户端必须位于同一应用的理由是这样可以使客户端正确地转换返回的对象并调用它的公开方法.service和客户端必需要位于同一个进程中,因为这样就不必执行跨进程的封送处理了.
例如,这下面这个service提供让客户端通过一个Binder实现调用service中的方法的功能:
类LocalBinder提供提供了getService()方法使得客户端能取得当前LocalService的实例.于是客户端就可以调用service中的公开方法了.比如,客户端可以调用service的getRandomNumber()方法.
下面是一个绑定到LocalService并且在按钮按下时调用getRandomNumber()的actvity的例子:
注:上面的例子没有明确地从service解除绑定.但是所有的客户端都应该在合适的时候解除绑定(比如当activity暂停时).