在TelephonyFramework中 Connection有一共有兩個
- android.telecom.Connection framewrok/base/telecomm
- com.android.internal.telephony.Connection framewrok/opt/telephony
這裏需要關注幾個重點
- 兩個Connection抽象
兩個Connection抽象類對應的代碼分別在framework/base/telecom和framework/opt/telephony代碼庫中。區分包名- android.telecom.Connection
android.telecom.Connection的子類代碼在TeleService代碼庫中,有TelephonyConnection抽象類GsmConnection和CdmaConnection作爲TelephonyConnection的抽象的子類- com.android.internal.telephony.Connection
com.android.internal.telephony.Connection的子類代碼在framewrok/opt/telephony代碼庫中,僅有一個子類就是GsmCdmaConnection- 運行空間
GsmConnection,CdmaConnection和GsmCdmaConnection對象全部是運行在com.android.phone進程中- 兩個Connection的關係
TelephonyConnection對象的mOrginalConnection屬性是GsmCdmaConnection對象的應用,在創建此對象時便建立起來了依賴關係;GsmCdmaConnection對象的mListenrs列表中,保存着TelephonyConnection內部匿名類對象,mOriginalConnectionListener,他重寫了com.android.internal.telephony.Connection.ListenerBase類的方法- 消息流轉
TelephonConnection通過mOrginalConnection屬性訪問Telephon Voice Call 語音通話模型中的屬性和方法重點:
GsmCdmaConnection通過mListers列表,調用其Listener接口,從而訪問TelephonyConnecton主類的方法,傳遞通話變化的相關信息。我這裏就不做代碼處理了
這裏來講解一下兩個通道處理
TelephonyConnection對象接收通話變化消息有兩個通道:
- GsmCdmaPhone對象的RegistrantList消息回調 (setOriginalConnection 方法調用時註冊Handle消息)
- GsmCdmaConnection對象的mListeners接口調用 (setOriginalConnection 方法調用時添加進入GsmCdmaConnection中mOriginalConnection.addListener(mOriginalConnectionListener);)
兩個通道接收到的通話變化消息,最後都是通過TelephonyConnection的mListener消息調用進行傳遞的。TelephonyConnection mListeners保存着android.telecom.Connection.Listener對象,他有8個子類,其中最關鍵的是ConnectionService和TelephonyConferenceController類的mConnectionListener內部匿名類對象