Android 6.0關于電話的各種Call和Connection

關于Call對象

一共4個
./packages/apps/InCallUI/src/com/android/incallui/Call.java
./packages/services/Telecomm/src/com/android/server/telecom/Call.java
./frameworks/base/telecomm/java/android/telecom/Call.java
./frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java


Call相關
  • frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java沒有使用,看樣子google打算放棄使用,轉用packages/services這個了。
  • Call狀態最終都是通過CallsManager來廣播出去的,CallsManager承上啟下。通過不同Call的轉換,最終在ui上體現出來。InCallService是UI和telecom的接口。InCallController綁定InCallService。
  • 從下往上,Call的傳到是:
    com.android.server.telecom.call --> android.telecom.call --> com.android.incallui.call
  • com.android.server.telecom.call對象是撥打電話的時候(CallsManger.startOutgoingCall),或者收到來電intent的時候創建的(CallsManger.processIncomingCallIntent)。inCallController中的toParcelableCall函數會new ParcelableCall對象,參數是com.androidservice.telecom.call對象。toParcelableCall有兩個地方可以調到,一個是onConnected的時候,就是inCallController綁定到incallService后,如果這個時候call不為空,就會走;還有一個地方是CallsManager回調onCallAdded的時候,也會調用。android.telecom.call就是通過這個ParcelableCall對象的相關信息來創建的。即完成了com.android.server.telecom.call到android.telecom.call的映射。
  • incallservice會在綁定的時候,把自己注冊到phone的listener中。當incallservice的客戶端(InCallController)調用addcall的時候,會傳過來一個parcelableCall的對象,incallservice會調用phone.internalAddCall來處理,在internalAddCall中根據這個parcelableCall對象生成telecomCall對象,然后phone通過fireCallAdded把這個call對象通過回調傳到incallservice中,incallservice調用onCallAdded,這個實現在incallui里面,即完成了android.telecom.call到 com.android.incallui.call的映射。
  • android.telecom.call作為構造參數創建com.android.incallui.call,同時incallui.call注冊telecommCall的回調函數,這樣有變化的時候,telecommCall會通知incallui.call來更新UI.

關于Connection對象

一共2個
./frameworks/base/telecomm/java/android/telecom/Connection.java
./frameworks/opt/telephony/src/java/com/android/internal/telephony/Connection.java


Connection相關
  • 總的來說,是先創建Call,然后創建Connection,最后Connection和Call關聯起來.TeleService這個包(packages/services/Telephony),負責Connection,Telecom這個包(packages/services/Telecomm)負責Call.
  • CallsManager中placeOutgoingCall或者processIncomingCallIntent中會調用call.startCreateConnection
    startCreateConnection會調用CreateConnectionProcessor.process().attemptNextPhoneAccount,然后attemptNextPhoneAccount調用ConnectionServiceWrapper(會連接ConnectionService)的createConnection,最終通過binder調用ConnectionService里面的createConnection.創建是com.android.services.telephony.TelephonyConnection的子類對象,有可能是GsmConnection/CdmaConnection.創建完connection后,如果是MO call,那么調用placeOutgoingConnection(MT調用onCreateIncomingConnection這里以MO為例),在placeOutgoingConnection其中,通過phone.dial返回一個com.android.internal.telephony.Connection對象,再通過com.android.services.telephony.TelephonyConnection的setOriginalConnection函數,把com.android.internal.telephony.Connection與其關聯起來。最后ConnectionService通過binder回調handleCreateConnectionComplete,傳入一個ParcelableConnection的對象,最終調到com.android.server.telecom.Call,把TelephonyConnection相關信息和Call相關聯。
  • 同上面Call相關中通過InCallService(InCallServiceImpl是實現)來傳遞對象,Connection相關是通過ConnectionService(TelephonyConnectionService是實現)來傳遞。

總結:

CallsManager很重要,主要流程都從它那過。分析問題可以從CallsManager入手。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,569評論 2 45
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評論 25 708
  • 分析Connection的創建 MO的時候,CallIntentProcessor(packages/servic...
    wbxjack閱讀 3,968評論 0 1
  • 1我把長句子分成若干個你 每次都能說說話 不至于尷尬 我把短句子再分 剩下標點符號了 頓號 逗號 分號 冒號 省...
    倩何人換取閱讀 444評論 2 2
  • 精心畫百合,世界上最怕“認真”二字,仔細的觀察細細的描繪,還真把勝放的百合畫出來了,放百合的凳子換成我最喜歡...
    洛飛揚閱讀 286評論 0 0