Android電話系統之GSMCallTracker

GSMCallTracker在本質上是一個Handler。 java

wps_clip_image-65

GSMCallTracker是Android的通話管理層。GSMCallTracker創建了ConnectionList來管理現行的通話鏈接,並向上層提供電話調用接口。 函數

wps_clip_image-1

在GSMCallTracker中維護着通話列表:connections。順序記錄了正鏈接上的通話,這些通話包括:ACTIVE,DIALING,ALERTING,HOLDING,INCOMING,WAITING等狀態的鏈接。GSMCallTracker將這些鏈接分爲了三類別進行管理: 學習

RingingCall: INCOMING ,WAITING spa

ForegourndCall: ACTIVE, DIALING ,ALERTING 設計

BackgroundCall: HOLDING 接口

上層函數經過getRingCall(),getForegrouandCall()等來得到電話系統中特定通話鏈接。 事件

爲了管理電話狀態,GSMCallTracker在構造時就將本身登記到了電話狀態變化通知表中。RIL-Java一收到電話狀態變化的通知,就會使用EVENT_CALL_STATE_CHANGE通知到GSMCallTacker ip

    在通常的實現中,咱們的通話Call Table是經過AT+CLCC查詢到的,CPI能夠通知到電話的改變,可是CPI在各個Modem的實現中差異比較大,因此參考設計都沒有用到CPI這樣的電話鏈接改變通知,而是使用最爲傳統的CLCC查詢CALL TABLE。在GSMTracker中使用connections來管理Android電話系統中的通話鏈接。每次電話狀態發生變化是GSMTracker就會使用CLCC查詢來更新connections內容,若是內容有發生變化,則向上層發起電話狀態改變的通知。 ci

1 RIL-JAVA中發起電話鏈接列表操做

在RIL-JAVA中涉及到CurrentCallList查詢的有如下幾個操做: get

(1)hangup

(2)dial

(3)acceptCall

(4)rejectCall

在GSMcallTracker在發起這些調用的時候都有一個共同的ResultMessage構造函數:obtainCompleteMessage()。obtainCompleteMessage()其實是調用:

obtainCompleteMessage(EVENT_OPERATION_COMPLETE)

這就意味着在這些電話操做後,GSMCallTracker會收到EVENT_OPERATION_COMPLETE消息,因而咱們將目光轉移到handleMessage()@GSMCallTracker的EVENT_OPERATION_COMPLETE事件處理:operationComplete@GSMCallTracker。

operationComplete()操做會使用cm.getCurrentCalls(lastRelevantPoll)調用,向RILD發起RIL_REQUEST_GET_CURRENT_CALLS調用,這個最終就是向Modem發起AT+CLCC,獲取到真正的電話列表。

2 在RILD中,引發getCurrentCalls調用

(1)在RILD中,收到URC消息:

+CRING

RING

NO CARRIER

+CCWA

將會使用RIL_onUnsolicitedResponse( RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED),主動向ril-java上報RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息。

(2) 在處理requestCurrentCalls時,使用CLCC查詢通話鏈接(CALL TABLE)後,如何發現有call Table不爲空則開啓一個定時器,主動上報RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息,直到沒有電話鏈接爲止。

在RIL-Java層收到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED這個URC,並利用mCallStateRegistrants.notifyRegistrants(new AsyncResult(null, null, null))來通知電話狀態的變化,此時GSMTracker會接收到EVENT_CALL_STATE_CHANGE消息,並使用

                pollCallsWhenSafe()->  cm.getCurrentCalls(lastRelevantPoll);

來發起查詢,並更新JAVA層的電話列表。

3 handlePollCalls電話列表刷新

      首先咱們來看看是什麼引發了handlePollCalls的調用。

     上面的1,2分析了,Android電話系統中全部引發電話鏈接列表更新的條件及其處理。他們共同的調用了cm.getCurrentCalls(lastRelevantPoll) 來完成電話列表的獲取。

lastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT)

咱們這裏就從能夠看到獲取到的電話列表Result使用handlePollCalls進行了處理。Result其實是一個DriverCall列表,handlePollCalls的工做就是將當前電話列表與RIL-Java的電話列表對比,使用DriverCall列表更新CallTracker的電話列表connections,並向上傳遞電話狀態改變的通知。


本人轉的博文是爲了方便之後我的查找和學習,無其餘目的,請支持原創,謝謝

相關文章
相關標籤/搜索