异步通道机制

概述

    AsyncChannel用来连接两个Handler之间的异步消息处理的通道,它的实现核心是Messenger。
因此它不仅支持进程内的消息传递,还支持多进程间的消息传递。
    AsyncChannel是Framework内部使用的一种通信机制,并没有作为API给应用程序使用。

两种模式

模式 客户端调用方法 服务端调用方法 描述 备注
半连接 connect、sendMessage replyToMessage 客户端发送请求给服务端,服务端不需要知道客户端的存在,只需要回复客户端消息。  
全连接 connect、sendMessage connected、sendMessage 服务端在客户端发送请求后,主动再次连接客户端,并通过四次握手方式完成全连接的建立。  

AsyncChannel命令标识

命令标识 Message.arg1 Message.obj Message.replyTo 描述
CMD_CHANNEL_HALF_CONNECTED 0 => STATUS_SUCCESSFUL, 1 => STATUS_BINDING_UNSUCCESSFUL AsyncChannel对象 目标Messenger  
CMD_CHANNEL_FULL_CONNECTION X X 源Messenger  
CMD_CHANNEL_FULLY_CONNECTED 0 => 接受连接, other => 拒绝连接 X X  
CMD_CHANNEL_DISCONNECT X X 断开连接的Messenger  
CMD_CHANNEL_DISCONNECTED 0 => STATUS_SUCCESSFUL, 1 => STATUS_BINDING_UNSUCCESSFUL, 2 => STATUS_SEND_UNSUCCESSFUL AsyncChannel对象 断开连接的Messenger  

AsyncChannel状态标识

状态标识 描述
STATUS_SUCCESSFUL 0 连接成功
STATUS_BINDING_UNSUCCESSFUL 1 绑定连接时出错
STATUS_SEND_UNSUCCESSFUL 2 发送消息时出错
STATUS_FULL_CONNECTION_REFUSED_ALREADY_CONNECTED 3 当连接一个已存在的连接时被拒绝

AsyncChannel如何工作

发起连接请求

方法名称 描述 备注
connectSrcHandlerToPackageSync(Context srcContext, Handler srcHandler, String dstPackageName, String dstClassName) 连接一个Handler到一个Class  
connectSync(Context srcContext, Handler srcHandler, Messenger dstMessenger) 同步连接一个Handler到一个Messenger  
connectSync(Context srcContext, Handler srcHandler, Handler dstHandler) 同步连接一个Handler到另一个Handler  
fullyConnectSync(Context srcContext, Handler srcHandler, Handler dstHandler) 两个Handler之间做全连接  
connect(Context srcContext, Handler srcHandler, String dstPackageName, String dstClassName) 连接一个Handler到一个Class  
connect(Context srcContext, Handler srcHandler, Class<?> klass) 连接一个Handler到一个Class  
connect(Context srcContext, Handler srcHandler, Messenger dstMessenger) 连接一个Handler到一个Messenger  
connect(Context srcContext, Handler srcHandler, Handler dstHandler) 连接两个Handler  
connect(AsyncService srcAsyncService, Messenger dstMessenger) 连接AsyncService和Messenger  

确认连接请求

方法名称 描述 备注
connected(Context srcContext, Handler srcHandler, Messenger dstMessenger) 连接Handler和Messenger,该方法通常在做全连接时,由Server调用回复给客户端  

发送消息

方法名称 描述 备注
sendMessage(Message msg) 向目标Handler发送消息  
sendMessage(int what) 向目标Handler发送消息  
sendMessage(int what, int arg1) 向目标Handler发送消息  
sendMessage(int what, int arg1, int arg2) 向目标Handler发送消息  
sendMessage(int what, int arg1, int arg2, Object obj) 向目标Handler发送消息  
sendMessage(int what, Object obj) 向目标Handler发送消息  

回复消息

方法名称 描述 备注
replyToMessage(Message srcMsg, Message dstMsg) 回复dstMsg给srcMsg  
replyToMessage(Message srcMsg, int what) 回复消息给srcMsg  
replyToMessage(Message srcMsg, int what, int arg1) 回复消息给srcMsg  
replyToMessage(Message srcMsg, int what, int arg1, int arg2) 回复消息给srcMsg  
replyToMessage(Message srcMsg, int what, int arg1, int arg2, Object obj) 回复消息给srcMsg  
replyToMessage(Message srcMsg, int what, Object obj) 回复消息给srcMsg  

断开连接

方法名称 描述 备注
disconnected() 当Handler接收到CMD_CHANNEL_DISCONNECTED消息时调用  
disconnect() 主动断开连接  

示例代码

客户端发送请求

服务端接收请求