android telephone 4.2 framework層分析
framework層的相關代碼主要在GSMPhone、CallManager、GSMCallTracker、TelePhonyManager中。
GSMPhone:
與GSMPhone關聯的主要是Phone.java、PhoneBase.java、GSMPhone.java。Phone作為基類,定義了25對Handler訊息註冊和登出的介面,而PhoneBase繼承Phone實現了24對,還有一對在GSMPhone中實現,而GSMPhone繼承了PhoneBase。
如何管理Phone對象的呢?在應用程式層的PhoneApp中調用PhoneFactory的靜態方法makeDefaultPhones建立Phone對象,而framework中採用的是代理模式和原廠模式實現,在makedefaultPhone中,建立了PhoneProxy,參數為GSMPhone或者CDMAPhone對象,通過PhoneProxy間接的訪問GSMPhone,增加了安全性。
GSMPhone繼承了PhoneBase,而PhoneBase中繼承了Handler。使用了RegistrantList的訊息處理機制,註冊和登出Handler訊息,並且發送notifyXXX方法發出多個註冊的通知。在應用程式層中擷取當前Phone的狀態,getForegroundCall、getBackgroundCall、getRingingCall,實際擷取的是GSMPhone中的mCT即CallTracker的屬性。
CallTracker 通話管理
主要功能在GSMCallTracker中實現,GSMCallTracker繼承CallTracker,CallTracker繼承Handler,因此GSMCallTracker的handleMessage接收CallTracker的訊息。GSMCallTracker類主要提供兩大處理能力:
1、通話控制能力,如撥號、接聽來電、拒接、多方通話(conference)和交換通話(switchWaitingOrHoldingAndActive),最終都會調用operationComplete方法,完成了通話管理和控制操作,該方法中也會查詢Call List通話列表,在接收到EVENT_CALL_STATE_CHANGE方法後(即通話狀態變化後),調用pollCallsWhenSafe方法,查詢當前CallList的通話列表。
2、Handler訊息處理邏輯。接收的來自RIL對象cm的訊息,包括通話狀態的變化、無線通訊模組Modem或者Radio開啟、無線通訊模組關閉或不可用狀態,以及接收CallTracker的訊息。
流程如下:
CallManager可以被上層調用,它運行於framework層,接著調用GSMPhone的mCT對象調用dial、acceptCall等控制通話,Calltracker中會調用cm的控制方法,cm為RIL層的對象,RIL層處理完畢後,發起EVEMT_OPERATION_COMPLETE訊息,在GSMCallTracker中處理,調用operationComplete,調用RIL的cm物件查詢Call List列表,RIL層查詢完畢後,發起EVENT_POLL_CALLS_RESULT訊息,GSMCallTracker處理訊息,調用handlePollCalls處理,更新通話狀態並且發出相關的訊息通知。
GSMCall的通話管理模型:
GSMCall中包含state狀態和connections通話串連列表。GSMConnection儲存了通話串連的基本資料,多個GSMConnection對象組成一路通話,而GSMCall管理state和connections,一路通話中有多個通話串連,即多方通話。
handlePollCalls方法:
通過接收到的Message訊息,擷取Call List,對象,強制轉化為List對象,這時儲存的實際上是DriverCall,RIL層的對象。匹配connections和DriverCall List中對應的DriverCall對象。dc.index== i++;conn表示老的通話串連,而dc表示新的通話串連。