以下是个人理解,错的地方希望指正出来,谢谢。
想要跨进程的通讯,有两种方法,一种是使用aidl,这个前面文章有提到。
还有一种是使用Messenger对象,这个对象实现了Parcelable接口。
在服务端的Service中我们要先实例化一个Messenger对象,传入一个Handler,并且重写handleMessage方法,用来处理客户端发来的消息。
然后在onBind方法中返回mMessenger.getBinder();
之后是客户端,客户端想要与之通讯,必须持有服务端的IBinder。
bindService的ServiceConncetion中拿到Messenger对象,可以使用实例化Messenger,把IBinder做参数传入。
实际上在实例化Messenger时,我们客户端持有的是远程的Binder,只是Android系统帮我们拿到了aidl接口。
拿到mMessenger时,就可以mMessenger.send(Message msg);实现通讯了。
那我们应该怎样让服务端来返回数据呢?
我们可以在send之前,让msg.replyTo=Messenger;这是一个新得实例化的Messenger,用来接收服务端的数据,和obj的使用时一样的。
在服务端就可以通过msg.replyTo拿到客户端的Messenger,之后就可以通过Messenger.send();把数据返回给我们的客户端,以达到双向通讯的效果。
而前面说到,我们如果想要发送数据到服务端,使用msg.obj是会出异常的,所以我们必须使用实现parcelable接口的方法来传递数据,还没有搞懂,稍后传上去。