Binding to a Service
应用组件(客户端)可以通过 bindService()
方法绑定到service,Android系统随后会调用service的 onBind()
方法,返回一个 IBinder
用于和service交互。
绑定过程是异步的(asynchronous) , bindService()
方法会立即返回,但是不会返回IBinder对象给客户端。
为了接收到IBinder,客户端必须创建一个ServiceConnection的实例,并且把它传给 bindService()
,这个 ServiceConnection
中会包含一个回调函数,系统调用它来传递 IBinder
对象。
注意:仅仅是activity,service和content provider可以和service绑定,你不能把一个broadcast receiver和一个service绑定。
为了将客户端和service绑定,你必须:
其中需要实现两个回调方法:
系统调用这个方法来传递service的onBind()
方法返回的 IBinder
。
当和service的连接意外丢失时,系统会调用这个方法。如果是客户端解除绑定,系统不会调用这个方法。
2.调用 bindService()
,并传递 ServiceConnection
的实现。
3.当系统调用你的 onServiceConnected()
,你可以开始用接口定义的方法访问service。
4.要断开连接,调用 unbindService()
。
当你的客户端被销毁的时候,会断开与service的连接,但是你应该在停止与service的交互时断开连接或者当activity暂停时断开连接,这样service就可以在它不被使用的时候关闭。
Additional notes
1.注意 DeadObjectException
异常,它会在连接断开时被抛出。
2.对象是整个进程计数的引用。(Objects are reference counted across processes.)
3.绑定和解除绑定应该在客户端生命周期中建立和销毁的对等时间执行。
比如:
如果你只需要在activity可见的时候和service交互,你应该在onStart()绑定,在 onStop()
中解除绑定。
如果你想要你的activity即便在后台停止时仍然接收响应,你可以在onCreate()
中绑定,在onDestroy()
中解除绑定。
通常不在 onResume()
和 onPause()
方法中进行绑定和解除绑定,因为这些回调函数在每次生命周期转换的时候都会调用,你应该把这些转换中的操作保持到最小。并且,如果多个activity绑定到同一个service,并且其中的两个activity有一个转换,service可能会被销毁然后又被重建。
参考资料
API Guides:Bound Services
http://developer.android.com/guide/components/bound-services.html