第三部分, 流程分析
1.Outgoing Call流程。
v
TwelveKeyDialer.java
|_onKeyUp()
|_placeCall()
v
OutgoingCallBroadcaster.java,
|_onCreate()
|_sendOrderedBroadcast(broadcastIntent, PERMISSION,
new OutgoingCallReceiver(), null, Activity.RESULT_OK, number,null);
|_ OutgoingCallReceiver
|_onReceive()
|_ doReceive()
|_context.startActivity(newIntent);
v
InCallScreen.java
|_ onCreate()
|_onNewIntent()
|_placeCall()
v
PhoneUtils.java
|_placeCall()
v
GSMPhone.java,
|_dial()
v
GsmCallTracker.java,
|_dial()
v
RIL.java
|_dial()
|_
RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
|...
|send(rr);
2.
Incoming Call的流程:
v
創建GsmPhone時,mCT = new GsmCallTracker(this);
v
創建GsmCallTracker時:
Ø
cm.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE,null);
Ø
mCallStateRegistrants.add(r);
v
RIL中的RILReceiver線程首先讀取從rild中傳來的數據:
Ø
processResponse()
Ø
processUnsolicited()
v
對應於incoming call,RIL收到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息,觸發mCallStateRegistrants中的所有記錄。
v
GsmCallTracker處理EVENT_CALL_STATE_CHANGE,調用pollCallsWhenSafe
v
函數pllCallsWhenSafe 處理:
§
lastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
§
cm.getCurrentCalls(lastRelevantPoll);
v
RIL::getCurrentCalls
§
RILRequestrr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS,result);
§
...
§
send(rr);
v
接着RIL調用processSolicited處理RIL_REQUEST_GET_CURRENT_CALLS的返回結果
v
GsmCallTracker的handleMessage被觸發,處理事件EVENT_POLL_CALLS_RESULT,調用函數 handlePollCalls
v
handlPollCalls 調用phone.notifyNewRingingConnection(newRinging);
v
PhoneApp中創建CallNotifier
v
CallNotifier註冊:
§
registerForNewRingingConnection ->mNewRingingConnectionRegistrants.addUnique(h, what, obj);