Android Telephony通話狀態更新消息上報流程

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的通話狀態變化通知,通過框架層嚮應用層發起通話狀態變化通知,包括來電,電話接通,進入通話中等。

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