今天通过以前写的简单的代码,分享通过Messenger 完成跨进成通信的使用,大神等请绕行。
接的外包越来越复杂,使我不得不急需从以前凌乱的成型的、未成型的项目中整理出一些主要的框架 – 2013. 中旬。
也是由于一般来说Messenger相比AIDL是把所有的请求都放到一个请求队列,逐一处理,无法支持同时处理并且Messenger仅仅只是通过传递message进行通讯,所以所有的操作只能在对方的Handle中处理,对于架构来说也不是很好,所以最近再次整理的时候需要将这些替换为AIDL通信,但是Messenger通信比较简单,还是很值得mark的,因此,先上当初写的拙码:
———— 服务端: SocketServer:
1 | package cn.dreamtobe.service; |
——————– BaseActivity:
1 | package cn.dreamtobe.activity; |
虽然我也想忽略一切直接分析Messenger,但是,这里还是提下,其中所有Socket有关的机制都封装在SocketHandle当中,其中一些主要的反馈通过接口SocketHandleCallBack在SocketService中实现。
那么,透过代码,我们可以看到在SocketService与BaseActivity中都有:
1 | /** |
对于SocketService(下称为Service端)而言mcMessenger来自BaseActivity(下称为Client端):mcMessenger = msg.replyTo; 而msMessenger 为Service端通过传入对应处理的Handle创建,所有的客服端发过来的有关处理都在这个Handle中处理。
1 | private class ServiceHandle extends Handler { |
并且在onBind时,返回Service端Messenger的IBinder:
1 |
|
对于Client端而言,mcMessenger的创建类似与msMessenger ,也是通过传入对应处理的Handle创建,而msMessenger是通过连接成功以后传入参数IBinder进行创建,还有一点值得注意的是,在发送message给Service端时,将message的replyTo赋值为mcMessenger,别忘了我们在Service端时是如何取得Client端的Messenger进行通信的:
1 | /** |
至此,已经简单的通过Messenger完成进程间通信。