通过上一篇Service的启动方式我们知道,bindService是能和其它组件进行通讯的。那么绑定者应该如何调用服务里面的方法呢?
要完成客户端与服务端的通信,那么必须要做这两件事:
1、在客户端完成bindService的调用以及相关配置。
2、在服务端里面实现onBind()方法的重写。
服务端方法:
public class LocalService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new LocalBinder();
}
//向客户端返回的IBinder对象
public class LocalBinder extends Binder{
LocalService getService(){
return LocalService.this;
}
}
//可供客户端调用的方法
public int getServiceNum(){
return new Random().nextInt(100);
}
}
客户端方法:
@Override
protected void initData() {
Intent intent = new Intent(this,LocalService.class);
//客户段绑定服务
bindService(intent,localServiceConnection, Context.BIND_AUTO_CREATE);
}
//通过连接服务,获得服务对象mLocalService,这样就可以调用服务端的方法
private ServiceConnection localServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LocalService.LocalBinder localBinder = (LocalService.LocalBinder)service;
mLocalService = localBinder.getService();
mIsBinder = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mIsBinder = false;
}
};
通过代码我们可以看到,绑定本地服务调用的步骤:
1.在服务端创建一个继承Binder的内部类,暴漏当前服务类的对象给客户端。以供客户端调用服务端的方法。
2.覆盖onBind方法,返回创建的内部类的对象(IBinder对象)。
3.在activity 绑定服务。bindService(intent,localServiceConnection, Context.BIND_AUTO_CREATE);
4.在activity通过ServiceConnection 方法获取服务端返回的IBinder对象I并强制转换为自定义接口的类型。
5.调用服务端的方法。
现在我们了解了bindService的调用步骤,相信有很多人发现了一个问题,那就是我们做了这么多事实上其实就是调用了本地进程其它类里面的一个方法而已,用得着这么复杂吗???
我们在上面的代码中出现了这么两个类,IBinder和Binder。通过源码我们可以看到Binder类是IBinder的实现类。我们不了解这两个类,所以我们就会有这样的疑惑。那么这两个类到底是干嘛的,今天我们不去仔细阐述它们。但是我们要知道它们的出现的意义,Binder具有粘结剂的意思,它是一个在整个Android系统中都非常重要的东西,是为高性能而设计的轻量级远程调用机制的核心部分。当然,它可以用于远程调用,也可以用于进程内调用,而我们经常在进程间通讯时主要是通过它们实现的。