一、oneway、in、out、inout关键字讲解
1、oneway:异步执行,不管服务器有没有执行完,直接返回
2、in:数据只能由客户端流入服务端
3、out:数据只能由服务端流出到客户端
4、inout:数据可以在服务端与客户端之间双向流通
二、Binder双向通讯思路
客户端跟服务端通讯其实是获取到服务端的IBinder对象,以此来操作服务端,
那么客户端也同理可以传递给服务端一个IBinder对象,以此来实现服务端操作客户端
三、linktodeath作用
客户端跟服务端双向通讯时,当服务端crash了,能够受到回调
DeathRecipient deathHandle = new DeathRecipient() {
@Override
public void binderDied() {
// TODO Auto-generated method stub
Log.i(TAG, "binder is died");
}
};
service.linkToDeath(deathHandle, 0);
四、messenger(原理其实就是基于aidl实现的简化版aidl跨进程通讯)
服务端需要实现一个Handler用于处理客户端发来的跨进程通信信息:
其次服务端构造出对应的Messenger:
服务端构造:
Messenger messenger = new Messenger(messengerHandler);
注意这里参数是messengerHandler即一个Handler
最后,当服务端的onBinder回调时候要返回Messenger的IBinder对象给客户端
@Nullable
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
2、客户端的使用
客户端还是和以前一样通过bindService在ServiceConnection类的onServiceConnected获取到服务端的返回的IBinder,从而获取到服务端的Messenger代理类,调用send函数发送Message。所以Messenger能发送的信息只有Message能携带的信息。
Intent intent = new Intent(MainActivity.this,MessengerService.class);
Log.i("test","MessengerService onClick ");
bindService(intent, new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
try {
Log.i("test","MessengerService onServiceDisconnected name = " +name);
messengerServer = new Messenger(service);
sendMessageToServer();
} catch (Exception e) {
e.printStackTrace();
Log.i("test","error " ,e);
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.i("test","client onServiceDisconnected name = " +name);
}
}, BIND_AUTO_CREATE);
void sendMessageToServer() throws RemoteException {
Message toServer = Message.obtain();
toServer.replyTo = messengerClientSend;
toServer.what = 1;
//toServer.obj = "hello I send from client"; 注意不可以 传递非parcel的对象,这个只能给obj赋值为parcel类型对象否则报错
Bundle bundle = new Bundle();
bundle.putString("bundleKey","bundleValue Client");
toServer.setData(bundle);
messengerServer.send(toServer);
}
(messenger)使用链接-https://blog.csdn.net/learnframework/article/details/119845833