Telephony通話消息上報流程
通話相關代碼名稱統一約定以及運行進程:
通話相關代碼名稱統一約定及運行進程彙總 | ||
路徑 | 統稱 | 進程 |
packages/app/Dialer | Dialer | com.android.dialer |
packages/service/telecomm | telecom | system_service |
packages/service/telephony | TeleService | com.android.phone |
framework/base/telecomm | framework | 無進程只是提供調用framwork |
framework/opt/Telephony | telephony | system_service或com.android.phone |
首先撥號流程和來電流程分析在前幾篇中寫道過來電流程,撥號流程。
撥號成功後,對方接聽了此路通話,那麼通話界面將更新當前通話中的通話狀態,並開始通話計時,可以理解爲:Modem——>RIL——>TeleService——>Telecom——>Dialer,一層一層上報通話狀態爲,“通話中....”,的消息處理和發送過程.
流程圖:
這裏需要關注幾個重點
三個應用的Call信息傳遞
TeleService應用首先接收到通話狀態更新的消息,通過framework/Telecom(framewrok)的Adapter服務設置不同的狀態(步驟11(傳入的是Id));接着service/Telecom(telecom)應用跟更新Call狀態(步驟13,步驟14);最後Telecom掉了用IInCallSerivce的updateCall接口更新Call狀態
RegistrantList消息處理
步驟2步驟3,在GsmCdmaPhone對象發出RegistranList消息通知後,在TelephonyConnection對象的mHandler匿名內部類對象的handlerMessage中響應MSG_PRECISE_CALL_STATE_CHANGED類型的Handler消息,該Handler消息的註冊入口在TelephonyConnection抽象類的兩個子類GsmConnectionh和CdmaConnection的setOriginalConnection方法中實現註冊MSG_PRECISE_CALL_STATE_CHANGED類型的Registran,並在GsmConnection的構造方法中調用setOriginalConnection接口進行消息註冊的初始化操作;而TelephonyConnection對象在TelephonyConnectionService類的onCreateOutgingConnection和onCreateIncommingConnection方法中創建。
TelephonyConnection對象的Listener註冊
步驟10:通過Listener對象的onStateChanged進行消息回調,那麼Listener對象是什麼?有是在什麼地方註冊的?是在ConnectionService的createConnection方法中,首先創建TelephonyConnection對象,然後調用addConnection方法,設置當前類的私有內部類Connection.Listener對象mConnectionListener爲TelephonyConnection對象的Listener
IConnectionServiceAdapter接口彙總
IConnectionServiceAdapterd的Stub接口實現在Telecom應用ConnectionServiceWrapper類的私有內部類Adapter中,它主要由setActive,setRinging,setAudioRoute等設置Call相關狀態信息的接口,以及onConnectionEvent,onRttInitiationSuccess,onRemoteRttRequest等消息通知接口構成
IInCallService接口彙總
IICallSerivce的Stub接口實現了framework/base下的InCallService抽象類的私有內部類InCallServiceBinder中,他主要由setInCallAdapter,addCall,updateCall等增加和更新Call對象相關的接口,以及onConnectionEvent,onCallAudioStateChanged等消息通知接口。而在Dialer應用中,InCallServiceImpl繼承了抽象類InCallService
Android通話模型,Dialer,Telepcom和TeleService三個系統應用主要負責的業務及運行進程空間,結合這四個通話的核心流程,可以抽象出模型,可以站在更高的層次去認識和理解Android Telephony通話功能。
系統的分層
Dialer,Telecom和TeleService三大應用可以理解爲:Dialer應用是普通的Android App應用,其運行進程的用戶信息和進程信息,也能說明此問題;Telecom應用運行在system_service進程上,其進程用戶名爲system系統用戶,說明他在運行在Android Framework框架層;TeleService應用運行的進程名是com.android.phone,用戶名是radio,承載着Telephony Call協議棧,同樣可以認爲他運行在Android Framewrok框架層;最後RIL他運行在HAL(硬件抽象層)。
交互方式
Dialer,Telecom,TeleService和RIL都是通過服務進行交互的,在圖中,他們之間有箭頭連接的都是通過Service跨進程的接口調用實現的。Dialer與TeleService之間沒有直接的消息傳遞,要通過Telecom進行消息中轉,Telecom與RIL直接同樣沒有直接的消息傳遞,要通過TeleService進行消息中轉。
通過服務進行跨進程接口調用實現消息的傳遞,服務接口調用本身就是同步的接口調用,在Service端的實現將轉換爲異步方式處理,待消息處理完成後,在使用回調的接口傳遞消息處理的結果
分解通話相關流程
根據消息的傳遞方向,可分成兩大類
第一類 控制通話消息下發流程 : 應用層通過框架層向RIL發起通話管理和控制相關RIL請求,RIL轉換成對應的消息發發送給Modem執行,其中包括撥號,接聽電話,拒接電話,保持,恢復通話等。
第二類 爲通話狀態更新消息上報流程 :RIL收到的Modem的通話狀態變化通知,通過框架層嚮應用層發起通話狀態變化通知,包括來電,電話接通,進入通話中等。