主动上报电话信息流程分析
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));
}
相关文章推荐
- 旋屏事件上报流程分析
- MyCat源码分析系列之——配置信息和启动流程
- Android5.1 Telephony流程分析——拨打电话流程(MO CALL)
- 分析基于Jsp+Servlet+JavaBean的个人信息管理系统的运行流程
- Android 电话博大流程源码分析
- Android电话拨打流程源码分析
- 从Phone源码中分析来电话流程(部分)
- 物流信息流程分析
- 高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)
- Android电话拨打流程源码分析
- SIM卡设置默认短信流程分析(数据流量和电话设置相似)
- Android 5.0/L 电话挂断流程分析
- MTK Phone 主动呼叫流程分析(一)
- 分析网站如何获取访客电话个人信息
- Android电话拨打流程源码分析
- Android电话拨打流程源码分析
- input上报流程分析【转】
- Android电话来电流程源码分析 .
- android拨打电话流程分析
- Android 7.0 挂断电话流程分析