这个绑定是异步的,bindService()方法立即返回,并且不给客户端返回IBinder对象。要接收IBinder对象,客户端必须创建一个ServiceConnection类的实例,并且把这个实例传递给bindService()方法。ServiceConnection对象包含了一个系统调用的传递IBinder对象的回调方法。
注意:只有Activity、Service、和内容提供器(content provider)能够绑定服务---对于广播接收器不能绑定服务。
因此,要在客户端绑定一个服务,必须做以下事情:
1.实现ServiceConnection抽象类
你的实现必须重写以下两个回调方法:
onServiceConnected()
系统会调用这个方法来发送由服务的onBind()方法返回的IBinder对象。
onServiceDisconnected()
Android系统会在连接的服务突然丢失的时候调用这个方法,如服务崩溃时或被杀死时。在客户端解除服务绑定时不会调用这个方法。
2.调用bindService()方法来传递ServiceConnection类的实现;
3.当系统调用你的onServiceConnected()回调方法时,你就可以开始使用接口中定义的方法来调用服务了;
4.调用unbindService()方法断开与服务的连接。
当客户端销毁时,它将于服务端解绑,但是当你完成与服务端的交互或Activity暂停时,你应该主动的与服务端解绑,以便服务能够在不使用的时候关掉。(绑定和解绑的时机会在稍后进行更多的讨论)。
例如,以下代码片段演示了把客户端连接到由继承Binder类创建服务,它所做的所有事情就是把服务端返回的IBinder对象转换成LocalService类,并且请求LocalService实例:
LocalService mService;
private ServiceConnection mConnection = new ServiceConnection() { // Called when the connection with the service is established public void onServiceConnected(ComponentName className, IBinder service) { // Because we have bound to an explicit // service that is running in our own process, we can // cast its IBinder to a concrete class and directly access it. LocalBinder binder = (LocalBinder) service; mService = binder.getService(); mBound = true; } // Called when the connection with the service disconnects unexpectedly public void onServiceDisconnected(ComponentName className) { Log.e(TAG, "onServiceDisconnected"); mBound = false; } };
用这个ServiceConnection类,客户端能够把它传递给bindService()方法来实现与服务端的绑定,如:
Intent intent = new Intent(this, LocalService.class); bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
1.bindService方法的第一个参数是一个Intent对象,它明确的命名要绑定的服务(虽然Intent能够隐含的指定);
2.第二个参数是ServiceConnection对象;
3.第三个参数是指明绑定选项的标识。通常它应该使用BIND_AUTO_CREATE,以便在服务不存在的时候创建这个服务。其他可能的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,或是什么都没有的“0”。
注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。
如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar