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 |
首先撥號流程和來電流程分析在前幾篇中寫道過來電流程,撥號流程。
我們在通話界面若想更改當前通話狀態,比如掛斷/接聽當前接收來電,掛斷/保持當前通話等操作,可以理解為是控制消息下發的過程,從Dialer——>Telecom——>TeleService——>RIL——>Modem,通話控制消息一層一層的下發,最終交給Modem處理具體的通話控制。通話狀態更改完成后,在將通話狀態變更的消息一層一層的上報,最后交給Dialer應用對通話界面進行更新和顯示。
這里需要關注幾個重點
三個應用的控制消息傳遞
? ? ? Dialer應用展示的通話界面或來電界面均有控制通話狀態請求的界面控制,通過滑動或是點擊相關的控件,將觸發通話轉態控制,調用android.telecom.Call對象的hold方法,如步驟1,在步驟3的Dialer應用中,調用IInCallAdapter的holdCall服務接口完成第一次的跨進程服務接口調用,進入Telecom應用。Telecom應用首先更新Call狀態,此處的Call對象為Telecom應用內部定義的類com.android.service.telecom.Call,步驟8調用IConnectionService的hold服務接口,完成第二次的款進程服務接口調用,進入到TeleService應用。TeleService應用中經過層層方法調用,由GsmCdmaCallTracker對象進行Call的hold操作,并將請求發給RIL對象,發出對應的RIL請求
IInCallAdapter接口匯總
IICallAdapter的Stub接口實現在Telecom應用的InCallAdapter類中,他主要由answerCall,rejectCall,playDtmfTone,mergeConference等接口構成;InCallAdapter對象則在InCallController對象綁定,IInCallService成功后創建。
IConnectionService接口匯總
IConnectionService的Stub接口實現在framework/base下的ConnectionService抽象類的匿名內部類中,mBinder為其對象,他主要由addConnectionServiceAdapter,createConnection等創建TelephonyConnection接口,以及answer,reject,hold,playDtmfTone等控制通話狀態的接口構成。而在TeleService應用中,TelephonyConnectionService繼承了抽象類TelephonyConnection。
Android通話模型,Dialer,telecom和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的通話狀態變化通知,通過框架層向應用層發起通話狀態變化通知,包括來電,電話接通,進入通話中等。
總結
以上是生活随笔為你收集整理的Android Telephony控制通话消息下发流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移相全桥PWM发波要求
- 下一篇: Python获取本机ip地址的两种有效方