關(guān)于Call對(duì)象
一共4個(gè)
./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
- frameworks/opt/telephony/src/java/com/android/internal/telephony/Call.java沒(méi)有使用赏陵,看樣子google打算放棄使用侣滩,轉(zhuǎn)用packages/services這個(gè)了睡陪。
- Call狀態(tài)最終都是通過(guò)CallsManager來(lái)廣播出去的,CallsManager承上啟下淮菠。通過(guò)不同Call的轉(zhuǎn)換,最終在ui上體現(xiàn)出來(lái)。InCallService是UI和telecom的接口。InCallController綁定InCallService狂魔。
- 從下往上,Call的傳到是:
com.android.server.telecom.call --> android.telecom.call --> com.android.incallui.call - com.android.server.telecom.call對(duì)象是撥打電話的時(shí)候(CallsManger.startOutgoingCall)淫痰,或者收到來(lái)電intent的時(shí)候創(chuàng)建的(CallsManger.processIncomingCallIntent)。inCallController中的toParcelableCall函數(shù)會(huì)new ParcelableCall對(duì)象整份,參數(shù)是com.androidservice.telecom.call對(duì)象待错。toParcelableCall有兩個(gè)地方可以調(diào)到,一個(gè)是onConnected的時(shí)候烈评,就是inCallController綁定到incallService后火俄,如果這個(gè)時(shí)候call不為空,就會(huì)走讲冠;還有一個(gè)地方是CallsManager回調(diào)onCallAdded的時(shí)候瓜客,也會(huì)調(diào)用。android.telecom.call就是通過(guò)這個(gè)ParcelableCall對(duì)象的相關(guān)信息來(lái)創(chuàng)建的竿开。即完成了com.android.server.telecom.call到android.telecom.call的映射谱仪。
- incallservice會(huì)在綁定的時(shí)候,把自己注冊(cè)到phone的listener中否彩。當(dāng)incallservice的客戶端(InCallController)調(diào)用addcall的時(shí)候疯攒,會(huì)傳過(guò)來(lái)一個(gè)parcelableCall的對(duì)象,incallservice會(huì)調(diào)用phone.internalAddCall來(lái)處理列荔,在internalAddCall中根據(jù)這個(gè)parcelableCall對(duì)象生成telecomCall對(duì)象敬尺,然后phone通過(guò)fireCallAdded把這個(gè)call對(duì)象通過(guò)回調(diào)傳到incallservice中,incallservice調(diào)用onCallAdded,這個(gè)實(shí)現(xiàn)在incallui里面贴浙,即完成了android.telecom.call到 com.android.incallui.call的映射砂吞。
- android.telecom.call作為構(gòu)造參數(shù)創(chuàng)建com.android.incallui.call,同時(shí)incallui.call注冊(cè)telecommCall的回調(diào)函數(shù),這樣有變化的時(shí)候,telecommCall會(huì)通知incallui.call來(lái)更新UI.
關(guān)于Connection對(duì)象
一共2個(gè)
./frameworks/base/telecomm/java/android/telecom/Connection.java
./frameworks/opt/telephony/src/java/com/android/internal/telephony/Connection.java
- 總的來(lái)說(shuō)崎溃,是先創(chuàng)建Call蜻直,然后創(chuàng)建Connection,最后Connection和Call關(guān)聯(lián)起來(lái).TeleService這個(gè)包(packages/services/Telephony)笨奠,負(fù)責(zé)Connection袭蝗,Telecom這個(gè)包(packages/services/Telecomm)負(fù)責(zé)Call.
- CallsManager中placeOutgoingCall或者processIncomingCallIntent中會(huì)調(diào)用call.startCreateConnection
startCreateConnection會(huì)調(diào)用CreateConnectionProcessor.process().attemptNextPhoneAccount,然后attemptNextPhoneAccount調(diào)用ConnectionServiceWrapper(會(huì)連接ConnectionService)的createConnection,最終通過(guò)binder調(diào)用ConnectionService里面的createConnection.創(chuàng)建是com.android.services.telephony.TelephonyConnection的子類(lèi)對(duì)象,有可能是GsmConnection/CdmaConnection.創(chuàng)建完connection后般婆,如果是MO call到腥,那么調(diào)用placeOutgoingConnection(MT調(diào)用onCreateIncomingConnection這里以MO為例),在placeOutgoingConnection其中蔚袍,通過(guò)phone.dial返回一個(gè)com.android.internal.telephony.Connection對(duì)象乡范,再通過(guò)com.android.services.telephony.TelephonyConnection的setOriginalConnection函數(shù)配名,把com.android.internal.telephony.Connection與其關(guān)聯(lián)起來(lái)。最后ConnectionService通過(guò)binder回調(diào)handleCreateConnectionComplete晋辆,傳入一個(gè)ParcelableConnection的對(duì)象渠脉,最終調(diào)到com.android.server.telecom.Call,把TelephonyConnection相關(guān)信息和Call相關(guān)聯(lián)瓶佳。 - 同上面Call相關(guān)中通過(guò)InCallService(InCallServiceImpl是實(shí)現(xiàn))來(lái)傳遞對(duì)象芋膘,Connection相關(guān)是通過(guò)ConnectionService(TelephonyConnectionService是實(shí)現(xiàn))來(lái)傳遞。
總結(jié):
CallsManager很重要霸饲,主要流程都從它那過(guò)为朋。分析問(wèn)題可以從CallsManager入手。