您的位置:首页 > 移动开发 > Android开发

主动上报电话信息流程分析

2017-08-13 20:22 627 查看

1,主动上报电话信息流程分析

和打电话,主动接听,挂断相对应的分别是远程来电,远程挂断电话等等,这时候消息的流程处理刚好相反。

首先接收到消息的是Modem层,然后Medoem再上传给RIL层,RIL进程通过sokcet将消息发送给

RILJ(framework层的RIL),进入RILJ的processUnsolicited方法.当有来电或者远程挂断时, RIL层发送

的是RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息。

 

RIL.java 的processUnsolicited方法对RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息处理逻辑如下,

1,首先获取该消息的结果,

case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED: ret = responseVoid(p); break;
responseVoid方法返回的是null,

private Object
responseVoid(Parcel p) {
return null;
}

2,然后分发消息,

case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
if (RILJ_LOGD) unsljLog(response);
mCallStateRegistrants.notifyRegistrants(new AsyncResult(null, null, null));
break;

Registrants是典型的观察者模式,一旦消息上报,就直接调用注册者。

mCallStateRegistrants是谁注册的呢?

RIL的父类BaseCommands的registerForCallStateChanged方法如下,

public void registerForCallStateChanged(Handler h, int what, Object obj) {
Registrant r = new Registrant (h, what, obj);
mCallStateRegistrants.add(r);
}

现在的问题是那个类调用registerForCallStateChanged方法,

在GsmCallTracker的构造方法中会调用该方法,

mCi.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null);

因此,一旦RIL收到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息,就会向GsmCallTracker发送

EVENT_CALL_STATE_CHANGE消息,

GsmCallTracker的handleMessage对EVENT_CALL_STATE_CHANGE消息处理如下,

case EVENT_CALL_STATE_CHANGE:
pollCallsWhenSafe();
break;

pollCallsWhenSafe方法在父类CallTracker中实现,该方法如下,

protected void pollCallsWhenSafe() {
mNeedsPoll = true;
if (checkNoOperationsPending()) {
mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
mCi.getCurrentCalls(mLastRelevantPoll);
}
}

封装EVENT_POLL_CALLS_RESULT消息,调用RIL的getCurrentCalls方法获取当前的call状态,当然,

查询完成结果返回之后, GsmCallTracker的handleMessage方法中会处理EVENT_POLL_CALLS_RESULT消息。

RIL的getCurrentCalls方法如下,

public void getCurrentCalls (Message result) {
RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
send(rr);
}

向ril库发送RIL_REQUEST_GET_CURRENT_CALLS消息进行查询,查询完成之后,ril库会将查询的结果通过socket上报给RIL, 

processSolicited对RIL_REQUEST_GET_CURRENT_CALLS消息处理的逻辑如下,

1,调用responseCallList获取查询结果,

case RIL_REQUEST_GET_CURRENT_CALLS: ret = responseCallList(p); break;
在responseCallList方法中,会将返回结果封装成ArrayList<DriverCall>,

ArrayList<DriverCall> response;
DriverCall dc;
num = p.readInt();
response = new ArrayList<DriverCall>(num);
•••

2,将结果发送出去,

if (rr.mResult != null) {
AsyncResult.forMessage(rr.mResult, ret, null);
rr.mResult.sendToTarget();
}

GsmCallTracker的handleMessage方法中对EVENT_POLL_CALLS_RESULT消息处理如下,

case EVENT_POLL_CALLS_RESULT:
ar = (AsyncResult)msg.obj;//获取查询结果

if (msg == mLastRelevantPoll) {
if (DBG_POLL) log("handle EVENT_POLL_CALL_RESULT: set needsPoll=F");
mNeedsPoll = false;
mLastRelevantPoll = null;
handlePollCalls((AsyncResult)msg.obj);
}

handlePollCalls方法主要是进行各种预处理以及通知。包括远程来电,远程接听电话,远程挂断电话,

1,远程来电的处理如下,

if (newRinging != null) {
mPhone.notifyNewRingingConnection(newRinging);
}

2,远程挂断的处理如下,

if (mDroppedDuringPoll.size() > 0) {
mCi.getLastCallFailCause(
obtainNoPollCompleteMessage(EVENT_GET_LAST_CALL_FAIL_CAUSE));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android phone