综述:
Messenger用于跨进程通信,他的实现方式是用到了AIDL,因为可以传递的对象类型比较多,所以应用范围比较广。
Messenger在API中的介绍如下
Reference to a Handler, which others can use to send messages to it. This allows for the implementation of message-based communication across processes, by creating a Messenger pointing to a Handler in one process, and handing that Messenger to another process.
Note: the implementation underneath is just a simple wrapper around a Binder that is used to perform the communication. This means semantically you should treat it as such: this class does not impact process lifecycle management (you must be using some higher-level component to tell the system that your process needs to continue running), the connection will break if your process goes away for any reason, etc.
相关的类:
Message,Handler,Intent,Bundle
Bundle可以传递的数据格式:常见的比如int,String,float不常见的比如Serializable和Parcelable类型。所以只要是实现了Serializable和Parcelable接口的类都可以进行传递。
Message可以传递的数据:arg1,arg2,what,obj,replyTo(Messenger对象),sendingUid(Optional field indicating the uid that sent the message.)这里重点聊一下Message的replyTo。
获得Message的最好的方式是调用Message.obtain() 和 Handler.obtainMessage()方法。obtain函数有很多参数不同的多态函数,其中一个是Message.obtain(Handler h,int what)第一个参数可以为null,第二个参数可以自定义。Messenger中经常用这个函数进行配对。
Handler在这里用的不多,先略过。
Intent之前介绍的很详细了。
使用方法
Messenger的使用包括两个地方,一个是server端,一个是client端。
1. 先准备好一个Message,这个Message可以通过Message.obtain(Handler h,int what)获得,可以添加Bundle数据以及replyTo。
2. 准备一个Messenger,这个Messenger可以通过new Messenger-Handler()或者msg.replyTo获得。
3. Messenger.send(msg)发送Message数据。
4. 在Handler的handleMessage()函数中获得指定what的msg,进行处理。
注意
Messenger可以传递的数据类型由Message可以传递的数据类型决定,如果想传递一个自定义的类,那么必须要保证这个类通过Parcelable或者Serializable序列化,然后放到Bundle对象中通过Message传递。