在之前的讨论中我们曾经看到,GsmCallTracker所维护的每一路GsmConnection都需要从modem侧及时更新当前通话状态。那么,这个CLCC是如何从framework侧发送的呢?
在ril.java中有方法getCurrentCalls(Messageresult),该方法即是将GET_CURRENT_CALLS的消息打包以socket方式发到cp侧,再转换为AT+CLCC指令发送到网络端的。
再往上看,会发现在GsmCallTracker中有方法operationComplete(),是它调用了getCureentCalls方法。有趣的是,这个方法中还有个实例变量pendingOperations用来计数,具体是做什么用的,后面会说到。
统计了一下,调用这个operationComplete()方法的,都是在framework侧收到这些消息的时候:
EVENT_OPERATION_COMPLETE
EVENT_SWITCH_RESULT
EVENT_CONFERENCE_RESULT
EVENT_SEPARATE_RESULT
EVENT_ECT_RESULT
EVENT_GET_LAST_CALL_FAIL_CAUSE
对于前五种消息,相信经常折腾framework侧Call业务的童鞋都不会陌生。像dial,reject,acceptCall,以及切换前后台通话,合并通话等等业务操作,都会将这几个对应的消息用obtain系列的方法包成Message参数发下去,等待指令操作完之后再带着消息回传上来,以此解决异步消息应答消息不同步的问题。而消息EVENT_GET_LAS