GsmCdmaCallTracker
重点关注Message,EVENT_OPERATION_COMPLETE,后续进行回调在handleMessage中进行进一步工作
public synchronized Connection dial(String dialString, int clirMode, UUSInfo uusInfo,
Bundle intentExtras){
// Always unmute when initiating a new call
setMute(false);
mCi.dial(mPendingMO.getAddress(), clirMode, uusInfo, obtainCompleteMessage());
updatePhoneState();
mPhone.notifyPreciseCallStateChanged();
return mPendingMO;
}
private Message obtainCompleteMessage() {
return obtainCompleteMessage(EVENT_OPERATION_COMPLETE);
}
RIL
重点关注Message result,赋值给RILRequest rr.result,后续modem返回响应进行相应处理
log打印:D RILJ : [1616]> DIAL [SUB1]
dial(String address, int clirMode, UUSInfo uusInfo, Message result) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); //构建RILRequest 对象
rr.mParcel.writeString(address); //存储数据,Parcel 用于进程间通信
rr.mParcel.writeInt(clirMode);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
send(rr);
}
RIL
重点关注rr.mResult.sendToTarget();回调至GsmCdmaCallTracker.handleMessage进行处理,EVENT_OPERATION_COMPLETE
LOG打印:D RILJ : [1616]< DIAL [SUB1]
processSolicited (Parcel p, int type) {
if (error == 0) {
if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
+ " " + retToString(rr.mRequest, ret));
if (rr.mResult != null) {
AsyncResult.forMessage(rr.mResult, ret, null);
//这就是在GsmCdmaCallTracker调用RILJ的dial方法前创建的Message对象!
//Message.sendToTarget,这样通过回调,流程就回到调用RILJ的dial方法的地方了。
rr.mResult.sendToTarget();
}
}
return rr;
}
GsmCdmaCallTracker
重点关注handleMessage的处理,通过Message EVENT_POLL_CALLS_RESULT进行相应的处理
public void handleMessage(Message msg) {
switch (msg.what) {
case EVENT_OPERATION_COMPLETE:
operationComplete();
break;
}
private void operationComplete() {
mPendingOperations--;
if (mPendingOperations == 0 && mNeedsPoll) {
//这里又封装了一个Message对象,调用RIL的getCurrentCalls方法主动获取一次call状态,
//接下来的流程又进入与RIL层的socket通信,过程与前面一样,最后GsmCdmaCallTracker收到
mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
mCi.getCurrentCalls(mLastRelevantPoll);
} else if (mPendingOperations < 0) {
// this should never happen
Rlog.e(LOG_TAG,"GsmCdmaCallTracker.pendingOperations < 0");
mPendingOperations = 0;
}
}
RIL
再次RIL GsmCdmaCallTracker进行交互,流程类似
***LOG打印:
D RILJ : [1623]> GET_CURRENT_CALLS [SUB1]
D RILJ : [1623]< GET_CURRENT_CALLS
{[id=1,DIALING,toa=129,norm,mo,0,voc,noevp,,cli=1,,3] } [SUB1]***
getCurrentCalls (Message result) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
send(rr);
}
processSolicited (Parcel p, int type) {
try {switch (rr.mRequest) {
case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break;
}
if (error == 0) {
if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
+ " " + retToString(rr.mRequest, ret));
if (rr.mResult != null) {
AsyncResult.forMessage(rr.mResult, ret, null);
//这就是在GsmCdmaCallTracker调用RILJ的dial方法前创建的Message对象!
//Message.sendToTarget,这样通过回调,流程就回到调用RILJ的dial方法的地方了。
rr.mResult.sendToTarget();
}
}
return rr;
}
GsmCdmaCallTracker
重点关注EVENT_POLL_CALLS_RESULT,在operationComplete进行的请求,下一步handlePollCalls
LOG打印: D GsmCdmaCallTracker: Event EVENT_POLL_CALLS_RESULT Received
public void handleMessage(Message msg) {
AsyncResult ar;
switch (msg.what) {
case EVENT_POLL_CALLS_RESULT:
Rlog.d(LOG_TAG, "Event EVENT_POLL_CALLS_RESULT Received");
if (msg == mLastRelevantPoll) {//在mCi.getCurrentCalls中进行了初始化mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
mNeedsPoll = false;
mLastRelevantPoll = null;
//在RIL.processSolicited中从底层返回的数据构造一个AsyncResult添加进msg.obj
handlePollCalls((AsyncResult)msg.obj);//msg的obj什么时候进行的初始化,创建msg的时候没有初始化obj,只有what
}
break;
}