3,远程挂断电话流程分析
3.1 services Telephony
当远程挂断/拒接电话时,GsmCallTracker的handlePollCalls 方法有关代码如下,
if (mDroppedDuringPoll.size() > 0) {
mCi.getLastCallFailCause(
obtainNoPollCompleteMessage(EVENT_GET_LAST_CALL_FAIL_CAUSE));
}
由于不是主动发起的挂断流程,因此会向RIL发送消息获取通话断开的cause,
RIL的getLastCallFailCause方法如下,
public void getLastCallFailCause (Message result) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_LAST_CALL_FAIL_CAUSE, result);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
send(rr);
}
注意,此时封装了EVENT_GET_LAST_CALL_FAIL_CAUSE消息。
向ril库发送RIL_REQUEST_LAST_CALL_FAIL_CAUSE消息,ril处理查询完成之后,返回上报结果, processSolicited方法中
对该消息处理如下,
1,读取消息处理结果,
case RIL_REQUEST_LAST_CALL_FAIL_CAUSE: ret = responseFailCause(p); break;
responseFailCause方法如下,
private Object responseFailCause(Parcel p) {
LastCallFailCause failCause = new LastCallFailCause();
failCause.causeCode = p.readInt();
if (p.dataAvail() > 0) {
failCause.vendorCause = p.readString();
}
return failCause;
}
返回的是LastCallFailCause对象。
2,分发消息给对应的注册类处理,
if (rr.mResult != null) {
AsyncResult.forMessage(rr.mResult, ret, null);
rr.mResult.sendToTarget();
}
GsmCallTracker的handleMessage方法中对EVENT_GET_LAST_CALL_FAIL_CAUSE消息处理如下,
1,首先获取结果