MarsServiceNative 是 Service
MarsServiceStub 是 Binder
MarsServiceProxy 是 ServiceConnection
-
初始化
MarsServiceProxy首先会在SampleApplicaton中初始化MarsServiceProxy,MarsServiceProxy中会创建一个Worker类,是线程类,然后每隔 50 毫秒死循环执行continueProcessTaskWrappers方法。 -
初始化
MarsServiceNative和MarsServiceNativecontinueProcessTaskWrappers方法中会判断MarsServiceNativeIM的服务是否启动,如果没有,则会通过bindService方法启动IM服务即MarsServiceNative,然后在MarsServiceNative启动成功会返回MarsServiceNative$Stub对象,在MarsServiceProxy的onServiceConnected中会将MarsServiceNative$Stub转为MarsServiceNative$Stub$Proxy保存为server -
阻塞读取要发送的消息 如果IM服务已经启动,则阻塞读取
queue -
注册推送回调 打开
ConversationActivity后,创建一个MainService类,然后将 cmdid 以 key,MainService为 value的形式保存到MarsServiceProxy类的pushMessageHandlerHashMap中,其中接收消息的回调值为PUSHMSG_CMDID即 10001 -
将要发送消息添加到队列中 将消息包装在
TextMessageTask中,然后调用MarsServiceProxy的send,将消息添加到MarsServiceProxy的queue中去 -
触发 3 步骤的阻塞,准备发送消息 然后调用
MarsServiceNative$Stub$Proxy的send方法,其中会将TextMessageTask转换为MarsTaskWrapper$Stub$Proxy,然后触发MarsServiceNative类中的send方法 -
封装
StnLogic.Task类,然后发送消息 根据TextMessageTask中的各种信息,封装一个StnLogic.Task类,然后将这个类和MarsTaskWrapper$Stub$Proxy以 key/value 的形式保存在一个TASK_ID_TO_WRAPPER字段中,调用StnLogic.startTask()发送信息 -
在回调中对 request 进行转换为 byte[] 在发送数据之前,首先要对数据进行编码,因为
MarsServiceStub实现了StnLogic.ICallBack接口,所以回调在MarsServiceStub的req2Buf中,MarsTaskWrapper$Stub$Proxy从TASK_ID_TO_WRAPPER中取出,然后调用其的req2Buf方法进行编码,最终触发到NanoMarsTaskWrapper的req2buf方法,将要发送的数据进行编码返回 -
触发回执信息的回调 发送信息成功后,服务器返回信息,然后触发
MarsServiceStub的buf2Resp方法,可以在其中做是否发送成功的回调,这个同样从TASK_ID_TO_WRAPPER中取出MarsTaskWrapper$Stub$Proxy,然后执行buf2Resp方法,最终执行到NanoMarsTaskWrapper的buf2resp方法,在其中会执行onPostDecode方法,而TextMessageTask中重写了这个方法,所以在里面有做是否成功的回调。
- 在
MarsServiceProxy的onServiceConnected方法中,我们有将一个MarsPushMessageFilter对象传入到MarsServiceStub中,而在MarsServiceProxy的onPush中是回调接收信息的,要用到这个对象。 - 所以直接看
MarsServiceProxy的MarsPushMessageFilter对象 - 在上面的 4 步骤中有将推送的回调保存在
MarsServiceProxy类的pushMessageHandlerHashMap中,这个根据cmdId取出相应的回调,然后将执行MainService的process方法 MainService中也维护了一个线程,然后将消息进行分发,主要有2个,一个是MessageHandler和StatisticHandler。 在MessageHandler中会发送一个广播,然后由ChatDataCore类进行接收,这个类是观察者模式,聊天界面的Activity已经注册进来了,所以直接更新聊天界面的adapter去刷新聊天界面。 在StatisticHandler中则保存了历史的回执消息,流量等信息的保存。