Android Telephony控制通话消息下发流程
?Telephony控制通話消息下發(fā)流程
| 通話相關(guān)代碼名稱統(tǒng)一約定及運(yùn)行進(jìn)程匯總 | ||
| 路徑 | 統(tǒng)稱 | 進(jìn)程 |
| packages/app/Dialer | Dialer | com.android.dialer |
| packages/service/telecomm | telecom | system_service |
| packages/service/telephony | TeleService | com.android.phone |
| framework/base/telecomm | framework | 無進(jìn)程只是提供調(diào)用framwork |
| framework/opt/Telephony | telephony | system_service或com.android.phone |
首先撥號流程和來電流程分析在前幾篇中寫道過來電流程,撥號流程。
我們在通話界面若想更改當(dāng)前通話狀態(tài),比如掛斷/接聽當(dāng)前接收來電,掛斷/保持當(dāng)前通話等操作,可以理解為是控制消息下發(fā)的過程,從Dialer——>Telecom——>TeleService——>RIL——>Modem,通話控制消息一層一層的下發(fā),最終交給Modem處理具體的通話控制。通話狀態(tài)更改完成后,在將通話狀態(tài)變更的消息一層一層的上報,最后交給Dialer應(yīng)用對通話界面進(jìn)行更新和顯示。
這里需要關(guān)注幾個重點
三個應(yīng)用的控制消息傳遞
? ? ? Dialer應(yīng)用展示的通話界面或來電界面均有控制通話狀態(tài)請求的界面控制,通過滑動或是點擊相關(guān)的控件,將觸發(fā)通話轉(zhuǎn)態(tài)控制,調(diào)用android.telecom.Call對象的hold方法,如步驟1,在步驟3的Dialer應(yīng)用中,調(diào)用IInCallAdapter的holdCall服務(wù)接口完成第一次的跨進(jìn)程服務(wù)接口調(diào)用,進(jìn)入Telecom應(yīng)用。Telecom應(yīng)用首先更新Call狀態(tài),此處的Call對象為Telecom應(yīng)用內(nèi)部定義的類com.android.service.telecom.Call,步驟8調(diào)用IConnectionService的hold服務(wù)接口,完成第二次的款進(jìn)程服務(wù)接口調(diào)用,進(jìn)入到TeleService應(yīng)用。TeleService應(yīng)用中經(jīng)過層層方法調(diào)用,由GsmCdmaCallTracker對象進(jìn)行Call的hold操作,并將請求發(fā)給RIL對象,發(fā)出對應(yīng)的RIL請求
IInCallAdapter接口匯總
IICallAdapter的Stub接口實現(xiàn)在Telecom應(yīng)用的InCallAdapter類中,他主要由answerCall,rejectCall,playDtmfTone,mergeConference等接口構(gòu)成;InCallAdapter對象則在InCallController對象綁定,IInCallService成功后創(chuàng)建。
IConnectionService接口匯總
IConnectionService的Stub接口實現(xiàn)在framework/base下的ConnectionService抽象類的匿名內(nèi)部類中,mBinder為其對象,他主要由addConnectionServiceAdapter,createConnection等創(chuàng)建TelephonyConnection接口,以及answer,reject,hold,playDtmfTone等控制通話狀態(tài)的接口構(gòu)成。而在TeleService應(yīng)用中,TelephonyConnectionService繼承了抽象類TelephonyConnection。
Android通話模型,Dialer,telecom和TeleService三個系統(tǒng)應(yīng)用主要負(fù)責(zé)的業(yè)務(wù)及運(yùn)行進(jìn)程空間,結(jié)合這四個通話的核心流程,可以抽象出模型,可以站在更高的層次去認(rèn)識和理解Android Telephony通話功能。
流程圖:
系統(tǒng)的分層?
? ? ? ?Dialer,Telecom和TeleService三大應(yīng)用可以理解為:Dialer應(yīng)用是普通的Android? App應(yīng)用,其運(yùn)行進(jìn)程的用戶信息和進(jìn)程信息,也能說明此問題;Telecom應(yīng)用運(yùn)行在system_service進(jìn)程上,其進(jìn)程用戶名為system系統(tǒng)用戶,說明他在運(yùn)行在Android Framework框架層;TeleService應(yīng)用運(yùn)行的進(jìn)程名是com.android.phone,用戶名是radio,承載著Telephony Call協(xié)議棧,同樣可以認(rèn)為他運(yùn)行在Android Framewrok框架層;最后RIL他運(yùn)行在HAL(硬件抽象層)。
交互方式
? ? ? Dialer,Telecom,TeleService和RIL都是通過服務(wù)進(jìn)行交互的,在圖中,他們之間有箭頭連接的都是通過Service跨進(jìn)程的接口調(diào)用實現(xiàn)的。Dialer與TeleService之間沒有直接的消息傳遞,要通過Telecom進(jìn)行消息中轉(zhuǎn),Telecom與RIL直接同樣沒有直接的消息傳遞,要通過TeleService進(jìn)行消息中轉(zhuǎn)。
? ? ? ?通過服務(wù)進(jìn)行跨進(jìn)程接口調(diào)用實現(xiàn)消息的傳遞,服務(wù)接口調(diào)用本身就是同步的接口調(diào)用,在Service端的實現(xiàn)將轉(zhuǎn)換為異步方式處理,待消息處理完成后,在使用回調(diào)的接口傳遞消息處理的結(jié)果
分解通話相關(guān)流程
根據(jù)消息的傳遞方向,可分成兩大類
? ? ? ? 第一類 控制通話消息下發(fā)流程 : 應(yīng)用層通過框架層向RIL發(fā)起通話管理和控制相關(guān)RIL請求,RIL轉(zhuǎn)換成對應(yīng)的消息發(fā)發(fā)送給Modem執(zhí)行,其中包括撥號,接聽電話,拒接電話,保持,恢復(fù)通話等。
? ? ? ?第二類 為通話狀態(tài)更新消息上報流程 :RIL收到的Modem的通話狀態(tài)變化通知,通過框架層向應(yīng)用層發(fā)起通話狀態(tài)變化通知,包括來電,電話接通,進(jìn)入通話中等。
總結(jié)
以上是生活随笔為你收集整理的Android Telephony控制通话消息下发流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移相全桥PWM发波要求
- 下一篇: Android开机速度优化 Androi