<button id="u2w23"></button>

<tbody id="u2w23"><track id="u2w23"></track></tbody><dd id="u2w23"><track id="u2w23"></track></dd><button id="u2w23"><acronym id="u2w23"></acronym></button> <tbody id="u2w23"><noscript id="u2w23"></noscript></tbody>

  • <button id="u2w23"></button><li id="u2w23"><acronym id="u2w23"><cite id="u2w23"></cite></acronym></li>

  • Android 系統電話管理機制二

    [來源] 達內    [編輯] 達內   [時間]2012-09-17

    RIL的RILReceiver對象通過相同LocalSocket通道收到AT命令的響應unmarshall后調用processSolicited()函數把應答結果封裝進命令攜帶的應答消息中發送回框架層的事件處理對象

     SipPhone

               如下是SipPhone實現相關類圖。

               

              SipPhone對象雖然也派生自PhoneBase,但實現機制及實例化過程與其它Phone 對象大大不同。

              SipPhone對象的實例化通過PhoneFactorymakeSipPhone 的接口調用SipPhoneFactorymakePhone進行實例化。SipPhone對象的實例化調用也不是在PhoneApp 對象中進行,而是在默認電話應用的SipBroadcastReceiver對象的onReceive 回調函數或者 SipCallOptionHandler對象的createSipPhoneIfNeeded函數中被調用,另外不同的是對SipPhone對象的創建個數也沒有限制。

           雖然實例化過程和CDMAPhoneGSMPhone對象不同,但實例化的 SipPhone對象和 CDMAPhoneGSMPhone對象一樣也被添加到CallManager對象中進行統一管理。

              SipPhone實現機制是通過IP通道實現電話功能,而不是通過無線通訊模塊,因此沒有采用RIL RIL daemon,因此框架實現層與CDMAPhoneGSMPhone有很大不同,SipPhone 框架實現主要是通過SipService系統服務及調用第三方協議棧來完成。SipService系統服務通過 JNI 來調用本地nist SIP協議堆棧。

              SipPhone對象屬于SipService服務的客戶端對象, 其通過SipManager 對象的ISipService接口調用SipService

          每個SipPhone對象都對應一個SipProfile對象(包括SIP 帳戶, 地址連接信息以及服務信息等信息)用來標識通話一方。SipProfile對象在SipPhoneFactory調用 makePhone 實例化SipPhone對象前根據網絡通話的sipUri構建,并作為makePhone 的參數傳給SipPhone對象。 

          每個SipPhone對象和其它具體Phone對象相同也包括三個Call 對象(SipCall ):ringingCallforegroundCallbackgroundCall ,每個 SipCall對象也包含一個Connection類型的ArrayList對象,用來維護每個CALL 擁有的通話連接。不過和其它Phone對象不同SipPhone對象對每個Call 對象擁有的connection個數沒有限制,SipCall擁有的connection 對象對應具體的 SipConnection對象。

             SipConnection對象包括主動和被動兩種類型,主動類型的SipConnection對象在SipCall 對象的dial 函數調用時創建,被動類型的SipConnection對象在SipCall對象接收到輸入CALL 時,其initIncomingCall函數調用時創建。創建的SipConnection對象添加到SipCall 對象的Connection類型的ArrayList數組列表中進行管理。

           每個SipConnection對象也包括一個SipProfile對象和一個 SipAudioCall對象。

           被動SipConnection類型的SipProfile對象和SipAudioCall 對象從對方獲得。被動類型的 SipAudioCall對象和initIncomingCall函數傳進來的SipAudioCall對象相同,SipProfile 對象通過調用SipAudioCallgetPeerProfile函數獲得發起通話的對方的SipProfile

           主動SipConnection類型的SipProfile對象在dial 函數中調用SipProfile.Builder 對象的build函數根據發起的通話URL構建,用來標識本地通話方,SipAudioCall 對象在調用dial函數時通過調用SipManager對象的makeAudioCall函數創建。

               SipAudioCall對象中包括一個客戶端SipSession對象,管理客戶端的每一個會話過程, SipSession 對象中有一個ISipSession接口成員,通過該接口調用服務端對應的會話對象SipSessionImpl 對象(一個實現ISipSession 接口的會話樁對象),共同完成通話一方的會話過程,客戶端通過ISipSession接口向服務端的SipSessionImpl 對象發起IPC調用。

           主動類型的SipAudioCall對象對應的SipSession對象在makeAudioCall函數中調用 createSipSession進行實例化,在makeAudioCall函數調用新創建SipAudioCall對象的makeCall 函數時,SipSession對象作為makeCall函數的參數傳給SipAudioCall 對象。主動類型的SipSession對象中的ISipSession類型的接口成員在createSipSession 中通過調用SipServicecreateSession函數創建,返回服務端SipSessionImpl 對象的遠程調用對象接口。

              SipServicecreateSession函數創建一個Sip會話對象的整個過程:

                   1、首先調用createGroup函數實例化一個SipSessionGroupExt 對象, SipSessionGroupExt對象派生自SipSessionAdapter,而SipSessionAdapter是一個實現 ISipSessionListener 接口的樁類;

              2、SipSessionGroupExt對象實例化時又調用createSipSessionGroup函數實例化一個SipSessionGroup對象;

              3、SipSessionGroup對象實例化時由SipFactory工廠對象實例化底層協議棧類對象SipStack,并有 SipStack 對象創建一個SipProvider對象和一個SipHelper對象,SipSessionGroup 對象本身登記為SipProvider對象的監聽對象;

                   4、然后調用SipSessionGroupExt對象的createSession 函數,內部實際調用 SipSessionGroup對象的createSession函數,實例化SipSessionImpl對象,并返回實例化后的 SipSessionImpl對象引用。

             SipSessionImpl屬于SipSessionGroup類的內部類,客戶端發起的通話請求都通過服務端的SipSessionImpl 對象封裝成EventObject類型的命令發起異步處理請求(調用SipSessionImpl對象的doCommandAsync 函數,doCommandAsync函數的參數是一個EventObject類型的對象),最終通過SipSessionGroup 對象的SipHelper對象調用SIP協議棧的接口與通話對方交互。

          每個SipSessionImpl會話對象被放到SipSessionGroup對象的HashMap 中進行管理。每個實例化的SipSessionGroupExt對象放到SipServiceHashMap中進行管理。

          客戶端也可以通過SipManager對象的open函數發起一個被動會話請求,過程為:

            1、 SipManager對象的open函數調用SipServiceopen3函數,同時也實例化一個PendingIntent對象通過SipServiceopen3函數傳給服務端的SipSessionGroupExt對象中;

            2、 open3函數中調用createGroup 函數實例化SipSessionGroupExt對象,并進一步實例化SipSessionGroup對象;

            3、 接著調用SipSessionGroup對象的openToReceiveCalls 函數來實例化一個SipSessionCallReceiverImpl對象作為接收會話,SipSessionCallReceiverImpl派生自 SipSessionImplSipSessionGroupExt對象作為函數參數傳進openToReceiveCalls函數,并在SipSessionImpl 構造函數時調用內部對象成員mProxySipSessionListenerProxy類,一個實現ISipSessionListener 接口的樁類)的setListener函數,為內部ISipSessionListener類型的成員賦值。

            4、 當接收到底層協議發來的會話請求時,監聽底層事件的對象SipSessionGroupprocessRequest函數被調用;

            5、 接著調用接收會話對象SipSessionCallReceiverImplprocess 函數,在process函數中判斷接收到的事件請求是Request.INVITE時就調用processNewInviteRequest 函數;

            6、 processNewInviteRequest函數中調用createNewSession 實例化一個SipSessionImpl對象作為新的會話,新的會話狀態為INCOMING_CALL。接著調用接收會話 SipSessionCallReceiverImpl對象內部成員mProxyonRinging函數,在onRinging 函數中調用其成員mListenerISipSessionListener類型)的onRinging 函數,實際調用 SipSessionGroupExt對象的onRinging函數;

            7、 SipSessionGroupExt對象的onRinging 函數中通過SipSessionGroupExt對象內部客戶端傳進來的PendingIntent對象向客戶端發送 ACTION_SIP_INCOMING_CALL 類型廣播消息;

            8、 客戶端在接收到這個廣播調用SipManagertakeAudioCall 函數。takeAudioCall函數首先通過SipService接口getPendingSession 獲得一個服務端會話對象引用;接著實例化一個SipAudioCall對象(SipAudioCall對象對應的 SipProfile 對象調用服務端會話對象的getLocalProfile函數獲得);然后根據服務端會話對象引用實例化一個客戶端SipSession 對象;并調用 SipAudioCall對象的attachCall實現SipSession對象與SipAudioCall對象的綁定;

            9、 最后調用現有的SipPhone對象的canTake 函數,在SipPhone對象的canTake函數中調用SipPhone 對象的ringingCall 對象的initIncomingCall函數實例化一個SipConnection對象,完成通話建立過程。

     

    四數據連接

              Telephony框架的數據連接模塊負責數據連接通道的建立,使電話能夠提供數據服務,如上網等,數據連接模塊的類圖如下圖。

             

     

     

              DataConnectionTracker是數據連接功能的核心,GsmDataConnectionTrackerCdmaDataConnectionTracker DataConnectionTracker的兩個派生類,實現具體網絡的數據連接的建立和管理。

           每一個數據連接用一個DataConnection對象表示,DataConnection 對應的具體網絡的派生類為GsmDataConnectionCdmaDataConnectionDataConnectionTracker中用一個HashMap 類型的變量 mDataConnections維護每一個數據連接。CDMA同時只能建立一路數據連接,GSM網絡則沒有限制。

              DataConnection對象是一個是一個狀態機對象,維護連接的狀態,并提供數據連接的 LinkPropertiesLinkCapabilities等屬性。DataConnection對象的狀態包括DcDefaultStateDcInactiveStateDcActivatingStateDcActiveStateDcDisconnectingStateDcDisconnectionErrorCreatingConnection六種狀態。

           對于GsmDataConnectionTracker對象,ApnContext對象提供數據連接的 APN 上下文,每一個APN類型都對應一個ApnContext對象,ApnContext 對象維護對應的APN 設置、DataConnectionTracker的狀態、對應的DataConnectionDataConnectionAc等。

           數據連接通道的建立過程:

              1、 數據連接的建立最終都通過GsmDataConnectionTracker CdmaDataConnectionTrackertrySetupData函數啟動數據連接;

              2、 trySetupData函數調用setupData 函數,設置數據連接參數(如采用的Apn設置參數,連接建立成功響應消息);

              3、 然后調用對應的DataConnection 對象的bringUp 函數發送數據連接消息(EVENT_CONNECT)。

              4、 EVENT_CONNECT消息由DataConnection 對象的狀態機的相應狀態對象接收處理,對于開始尚未建立數據連接時,DataConnection對象處于DcInactiveState 狀態,因此DcInactiveState 狀態對象接收處理EVENT_CONNECT事件,調用onConnect函數,并轉變為DcActivatingState 狀態。

              5、 在具體DataConnection 對象的onConnect 函數中調用RIL接口setupDataCall函數啟動數據連接;

              6、 連接建立后RIL 層回應EVENT_SETUP_DATA_CONNECTION_DONE 請求應答事件,由DataConnection對象的DcActivatingState狀態對象接收處理 EVENT_SETUP_DATA_CONNECTION_DONE事件,調用onSetupConnectionCompleted函數,并過渡到DcActiveState狀態,連接建立成功。

              DataConnectionTracker對象采用DataConnectionAc對象(派生自AsyncChannel )與DataConnection 對象通訊。

              GsmDataConnectionTracker對象在setupData函數調用createDataConnection 函數創建時GsmDataConnection 對象和DataConnectionAc對象,并通過DataConnectionAc對象與GsmDataConnection 對象建立異步通訊連接。GsmDataConnectionTracker對象對于每類ApnContext都可以建立一個 GsmDataConnection 對象和一個DataConnectionAc對象。

             CdmaDataConnectionTracker對象在實例化時調用createAllDataConnectionList 函數創建需要的數據連接對象CdmaDataConnection DataConnectionAc對象。CdmaDataConnectionTracker 對象只支持創建一個 CdmaDataConnection對象和DataConnectionAc對象。

     

    五事件通知機制

             整個Telephony事件通知框架包括三層: RIL 消息層、框架事件處理層、應用層。類圖如下圖,主要是請求應答模式和觀察者模式的采用。

               

           整個框架層以PhoneBase為中心,向上通過PhoneNotifier 接口向應用層發送框架層產生的的事件,應用層通過TelephonyRegistry 接口提供對特定事件的監聽,由PhoneNotifier接口的默認實現DefaultPhoneNotifier通過 TelephonyRegistry對象向應用層發送事件通知。

           向下框架層通過CommandsInterface接口注冊Unsolicited 事件(主動通知事件)及發起AT 命令請求。框架層的事件處理對象包括CDMAPhoneGSMPhone兩個對象本身及其包含的 SMSDispatcherIccFileHandlerDataConnectionTrackerIccRecords 類型的對象以及PhoneBase 中的SmsStorageMonitor對象。

           這些對象都是Handler對象,都能夠向RIL層注冊Unsolicited事件及發起AT 命令請求。也能夠接收和處理RIL層產生的Unsolicited事件及AT命令的響應。

              CDMAPhoneGSMPhone對象中的事件處理對象除了CallTrackerServiceStateTracker 對象外,其它都在PhoneBase中由基類實現。

           向RIL層注冊的Unsolicited事件都登記添加到BaseCommands 類中的RegistrantList 類型的對象中或者設置為BaseCommands類中的Registrant 類型的對象(根據設置函數的參數實例化具體類型的Registrant類型的對象)。

              RIL層產生的Unsolicited事件通過在BaseCommands 類中登記的RegistrantList 對象或設置的Registrant對象向框架層的事件處理對象發送Unsolicited事件。

             框架層的事件處理對象向RIL層發送的命令直接發送給 RIL 對象的相應函數,向RIL層發送的命令中都帶有一個Message類型的應答消息,RIL 對象的相應函數把接收到的命令攜帶的參數封裝進RILRequest請求中發送給RILRILSender 對象并 marshall后通過LocalSocket發送給rild進程。

             RILRILReceiver對象通過相同LocalSocket通道收到AT 命令的響應unmarshall后調用processSolicited()函數把應答結果封裝進命令攜帶的應答消息中發送回框架層的事件處理對象。

           RILSender對象和RILReceiver對象都實現了接口,在獨立線程運行。

    資源下載

    ?