Android RIL源碼分析(3)

第三部分, 流程分析

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);

發佈了54 篇原創文章 · 獲贊 14 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章