1.Android手機(jī)可能會(huì)有兩張SIM卡漓概,每張SIM卡是一個(gè)PhoneAccount,PhoneAccount對(duì)象是在哪里新建的根时?
TelecomAccountRegistry.java (packages\services\telephony\src\com\android\services\telephony)的registerPstnPhoneAccount方法PhoneAccount.builder(phoneAccountHandle, label).build()
2.Sim卡信息(包括顏色)是哪里設(shè)置的瘦赫?
SubscriptionController的addSubInfoRecord方法,里面包括sim卡的信息蛤迎,并且將這些信息保存到了TelephonyProvider數(shù)據(jù)庫(kù)中确虱。
3.桌面上電話圖標(biāo)打開的是哪個(gè)界面?
Activity是DialtactsActivity替裆,星號(hào)對(duì)應(yīng)的Fragment是SpeedDialFragment校辩。加載數(shù)據(jù)的CursorLoader是ContactTileLoaderFactory.createStrequentPhoneOnlyLoader。Adapter是PhoneFavoritesTileAdapter辆童,ListView的item是PhoneFavoriteSquareTileView宜咒。
4.INNER JOIN和Left Outer Join
A INNER Join B 完全連接,列出A和B中都存在的記錄
A Left Outer Join B把鉴,列出A和B都存在的記錄故黑,也列出A中去除交集的部分
5.撥號(hào)數(shù)字UI
dialpad_fragment.xml ---> dialpad_view.xml--->dialpad_view_unthemed.xml--->dialpad.xml(這個(gè)里面有數(shù)字按鍵)
通話界面點(diǎn)擊鍵盤出來的是InCallUI下面的DialpadFragment,而撥打電話的時(shí)候是diapad下面的DialpadFragment庭砍。
6.TelecomManager,TelephonyManager相關(guān)
TelecomManager和TelephonyManager都有g(shù)etTelecomService方法场晶,這個(gè)Service的實(shí)現(xiàn)在TelecomServiceImpl類中。
TelephonyManager有g(shù)etITelephony方法怠缸,這個(gè)Service的實(shí)現(xiàn)是在PhoneInterfaceManager類中诗轻。
7.來電鈴聲
代碼在DialerRingtoneManager.java
8.CallList
所有對(duì)Call的操作都在updateCallInMap方法中:如果狀態(tài)是disconnected并且此call已經(jīng)存在,更新mCallById揭北、mCallMap扳炬、mCallByTelecomCall;如果狀態(tài)不是IDLE和INVALID罐呼,更新mCallById鞠柄、mCallMap、mCallByTelecomCall嫉柴;剩下的狀態(tài)將Call對(duì)象從mCallById厌杜、mCallMap、mCallByTelecomCall中移除。
調(diào)用updateCallInMap的方法有onCallRemoved夯尽、onDisconnect瞧壮、onIncoming、clearOnDisconnect匙握、onUpdateCall咆槽、finishDisconnectedCall。
調(diào)用過程為(InCallServiceImpl的server端為InCallController圈纺,而CallsManager會(huì)回調(diào)給InCallController秦忿,所以CallsManager對(duì)Call是真正的管理者,Dialer中的CallList數(shù)據(jù)來自CallsManager):
CallsManager將InCallController加入到mListeners中蛾娶,并進(jìn)行callback回調(diào)---》InCallController的updateCall---》InCallServiceBinder的updateCall---》InCallService的handleMessage如MSG_UPDATE_CALL---》Call(base/telecom)的fireCallDestroyed---》Phone(base/telecom)的fireCallRemoved---》InCallService(base/telecom)的內(nèi)部類mPhoneListener的onCallRemoved被調(diào)用---》InCallServiceImpl的onCallRemoved---》InCallPresenter的onCallRemoved---》CallList的onCallRemoved
9.CallAudio相關(guān)
CallAudioModeStateMachine對(duì)象由CallsManager創(chuàng)建灯谣,在構(gòu)造函數(shù)中默認(rèn)為mUnfocusedState,然后send一個(gè)INITIALIZE的message蛔琅,CallsManager的狀態(tài)發(fā)生變化后會(huì)調(diào)用CallAudioManager的onCallEnteringActiveDialingOrConnecting方法胎许,然后調(diào)用CallAudioModeStateMachine的sendMessageWithArgs(NEW_ACTIVE_OR_DIALING_CALL)------》CallAudioModeStateMachine的UnfocusedState收到NEW_ACTIVE_OR_DIALING_CALL后,進(jìn)入mSimCallFocusState罗售,之后會(huì)調(diào)用mCallAudioManager的setCallAudioRouteFocusState(HAS_FOCUS)------>CallAudioRouteStateMachine的sendMessageWithSessionInfo(SWITCH_FOCUS,HAS_FOCUS)------>CallAudioRouteStateMachine的ActiveEarpieceRoute的enter方法辜窑。
CallAudioRouteStateMachine對(duì)象由CallsManager創(chuàng)建然后初始化initialize,initialize方法中的getInitialAudioState初始化Audio寨躁,默認(rèn)是ROUTE_EARPIECE穆碎,所以會(huì)調(diào)用到QuiescentEarpieceRoute的enter方法,
接聽電話過程中插入耳機(jī):WiredHeadsetManager收到headsetplugginchanged事件后朽缎,callback給事件接收者CallAudioRoutePeripheralAdapter惨远,然后send消息CONNECT_WIRED_HEADSET給CallAudioRouteStateMachine谜悟,這樣從ActiveEarpieceRoute切換到ActiveHeadsetRoute话肖。
10.CallsManager是在TelecomSystem中新建的。
11.Telephony中有很多Call類葡幸,他們之間的關(guān)系是什么最筒?
12.有時(shí)候會(huì)出現(xiàn)開機(jī)第一次默認(rèn)勾選的APN不是第一個(gè),如Vodafone的APN蔚叨。
DcTracker在createAllApnList方法里面是按照id來排序去查找carriers床蜘,然后會(huì)將apn列一樣的合并起來,印度Vodafone的APN中MMS和VodafoneLive! apn列一樣蔑水,會(huì)被合并成一個(gè)邢锯,由于VodafoneLive!可以處理default類型,這樣VodafoneLive搀别!會(huì)被當(dāng)作默認(rèn)的apn丹擎,在Settings里面查找carriers表是按照name排序的所以Vodafone Connect是在第一個(gè)。就會(huì)出現(xiàn)第一次開機(jī)默認(rèn)勾選第二個(gè)VodafoneLive!,恢復(fù)默認(rèn)會(huì)變成第一個(gè)Vodafone Connet。
13.主叫流程
14.Phone相關(guān)的AIDL
15.來一通電話蒂培,從頭分析
看PstnIncomingCallNotifier的mHandler如何處理
16.通話中聯(lián)系人名稱從哪里來再愈?
17.DcNetworkAgent是由誰來創(chuàng)建的?
PhoneSwitcher會(huì)調(diào)用到DcTracker的requestNetwork并傳過來NetworkRequest對(duì)象护戳。
requesetNetwork方法:a.通過NetworkRequest的networkCapabilities來得到對(duì)應(yīng)的apnId翎冲,如APN_DEFAULT_ID,APN_IMS_ID媳荒;b.通過apnId得到ApnContext;c.調(diào)用ApnContext的incRefCount抗悍,這個(gè)方法會(huì)調(diào)用DcTracker的setEnabled方法
DcTracker的setEnabled方法:調(diào)用onEnableApn方法祟绊,onEnableApn方法會(huì)調(diào)用applyNewState方法纸泡,然后調(diào)用trySetupData方法随夸,然后一直調(diào)用到trySetupData方法兆沙。
trySetupData方法:a.createDataConnection荞膘;b.DcAsyncChannel的bringUp方法
createDataConnection方法:a.makeDataConnection面氓,新建DataConnection對(duì)象绝骚,并進(jìn)入DcInactivieState蜜葱;b.new DcAsyncChannel;c.DcSyncChannel的fullyConnectSync,設(shè)置了下srcMessager和dstMessager
DcAsyncChannel的bringUp方法:發(fā)消息EVENT_CONNECT給dstMessager田柔,這個(gè)消息是DataConnection的當(dāng)前狀態(tài)DcInactiveState收到俐巴,先initConnection,再調(diào)用onConnect(調(diào)用RIL的setupDataCall,當(dāng)此方法結(jié)束后會(huì)發(fā)送EVENT_SETUP_DATA_CONNECTION_DONE消息)硬爆,進(jìn)入DcActivatingState狀態(tài)欣舵,當(dāng)DcActivatingState收到EVENT_SETUP_DATA_CONNECTION_DONE消息時(shí),進(jìn)入DcActiveState狀態(tài)缀磕,這個(gè)狀態(tài)會(huì)新建DcNetworkAgent缘圈。