# Android電話系統之GSMCallTracker
通話連接管理
GSMCallTracker在本質上是一個Handler。
[
](http://hi.csdn.net/attachment/201005/14/0_1273850076CzIU.gif)
GSMCallTracker是Android的通話管理層。GSMCallTracker建立了ConnectionList來管理現行的通話連接,并向上層提供電話調用接口。
[
](http://hi.csdn.net/attachment/201005/14/0_1273850080TJjj.gif)
在GSMCallTracker中維護著通話列表:connections。順序記錄了正連接上的通話,這些通話包括:ACTIVE,DIALING,ALERTING,HOLDING,INCOMING,WAITING等狀態的連接。GSMCallTracker將這些連接分為了三類別進行管理:
RingingCall: INCOMING ,WAITING
ForegourndCall: ACTIVE, DIALING ,ALERTING
BackgroundCall: HOLDING
上層函數通過getRingCall(),getForegrouandCall()等來獲得電話系統中特定通話連接。
為了管理電話狀態,GSMCallTracker在構造時就將自己登記到了電話狀態變化通知表中。RIL-Java一收到電話狀態變化的通知,就會使用EVENT_CALL_STATE_CHANGE通知到GSMCallTacker
在一般的實現中,我們的通話Call Table是通過AT+CLCC查詢到的,CPI可以通知到電話的改變,但是CPI在各個Modem的實現中差別比較大,所以參考設計都沒有用到CPI這樣的電話連接改變通知,而是使用最為傳統的CLCC查詢CALL TABLE。在GSMTracker中使用connections來管理Android電話系統中的通話連接。每次電話狀態發生變化是GSMTracker就會使用CLCC查詢來更新connections內容,如果內容有發生變化,則向上層發起電話狀態改變的通知。
### 1 RIL-JAVA中發起電話連接列表操作
在RIL-JAVA中涉及到CurrentCallList查詢的有以下幾個操作:
(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,并向上傳遞電話狀態改變的通知。
- 前言
- (一)分析方法論探討之設計意圖
- (二)方法論探討之概念空間篇
- (三)手機之硬件形態
- (四)手機的軟件形態
- (五)基本空間劃分
- (六)IPC框架分析 Binder,Service,Service manager
- (七)Service深入分析
- (八)Android 啟動過程詳解
- (九)Zygote Service
- (十)Android GWES之基本原理篇
- (十一)Android GWES之消息系統
- (十二)Android GEWS窗口管理之基本架構原理
- (十三)Android GWES之Android窗口管理
- (十四)Android GWES之輸入系統
- (十五)Android輸入系統之輸入路徑詳解
- (十六)Android電話系統-概述篇
- (十七)電話系統之rilD
- (十八)Android電話系統之RIL-Java
- (十九)電話系統之GSMCallTacker
- (二十)Android應用程序框架之無邊界設計意圖
- (二十一)Android應用框架之AndroidApplication
- (二十二)Android應用框架之Activity
- (二十三)Andoird GDI之基本原理及其總體框架
- (二十四)Android GDI之顯示緩沖管理
- (二十五)Android GDI之共享緩沖區機制
- (二十六)Android GDI之SurfaceFlinger
- (二十七)Android GDI 之SurfaceFlinger之動態結構示意圖
- (二十八)Android GDI之Surface&Canvas