<li id="34b3z"></li>
    <nav id="34b3z"></nav>
  1. <wbr id="34b3z"><legend id="34b3z"></legend></wbr>
    
    

        1. <form id="34b3z"></form>
          <sub id="34b3z"><table id="34b3z"><th id="34b3z"></th></table></sub>

          Android 系統電話管理機制一

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

          電話管理是Android 系統支持的重要的業務之一,提供接聽電話,收發短信、電話薄、網絡事件監聽、讀取用戶信息等功能。

          電話管理是Android  系統支持的重要的業務之一,提供接聽電話,收發短信、電話薄、網絡事件監聽、讀取用戶信息等功能。

                   從下到上可以分為四層:硬件驅動層、RIL daemon層、 Telephony 框架實現層、 PHONE應用層,下層為上層提供服務,每層之間采用不同的通訊方式交互。RIL daemon 層實現為單獨的一個開機啟動的進程(rild命令),通過AT命令硬件驅動層交互, Telephony  JAVA框架實現層包括一個RIL抽象層, RIL 抽象層中通過一個本地socketRIL daemon層(rild )交互,PHONE 應用層通過BINDER機制與Telephony框架交互。

                   本文主要分析框架層相關的主要類的結構。

           Telephony框架

                   Telephony框架系統類圖如下圖:

                   

           

                   Telephony框架層為應用層和框架層的其它服務提供Telephony 服務,提供了如下幾個服務:PhoneInterfaceManager 服務,是ITelephony接口的樁實現,IccSmsInterfaceManager 短消息服務,是 Isms接口的樁實現;IccPhoneBookInterfaceManager電話本服務,是IIccPhoneBook接口的樁實現; PhoneSubInfo提供用戶信息讀取服務,是IPhoneSubInfo接口的樁實現;TelephonyRegistry 提供應用層的消息登記服務,是ITelephonyRegistry接口的樁實現。

                 應用程序通過以下幾個客戶端對象使用Telephony框架提供的服務。

                 應用程序可以在SmsManager單例對象(通過SmsManager類的 getDefault函數返回 SmsManager單例對象)中訪問IccSmsInterfaceManager服務,用來收發短信。

                 通過IccProvider一個內容提供對象提供對IccPhoneBookInterfaceManager 服務的訪問,讀取和管理電話本。 

                 通過TelephonyManager對象提供對PhoneSubInfoPhoneInterfaceManager TelephonyRegistry服務的訪問,TelephonyManager對象通過getSubscriberInfo函數獲得PhoneSubInfo 服務的遠程訪問代理對象。通過getITelephony函數獲得PhoneInterfaceManager 的遠程訪問代理對象。提供一個對象全局sRegistry(指向TelephonyRegistry 服務的遠程訪問代理對象)訪問TelephonyRegistry服務。

                   TelephonyManager通過這三個接口函數提供對外的TelephonyAPI,因此應用程序可以通過  TelephonyManager 對象提供的TelephonyAPI訪問這些服務,使用Telephony框架層提供的接口功能。

                   TelephonyManager對象本身通過Context對象調用getSystemService(Context.TELEPHONY_SERVICE) 函數返回, TelephonyManager對象是一個單例對象。

                   PhoneInterfaceManager服務在默認電話應用的PhoneApp對象中采用單例模式進行初始化(PhoneApp 對象本身也是單例對象),和PhoneApp對象公用一個進程,PhoneInterfaceManager 為框架層的其它服務提供Telephony API  服務,并通過TelephonyManager對象(通過getITelephony函數獲得ITelephony 接口)為其它應用提供服務。PhoneInterfaceManager通過PhoneAppCallManagerPhone對象實現相應功能。CallManager是一個單例對象,CallManager 對象提供 CALL控制以及登記通知等功能。

                   Phone對象是整個Telephony服務的核心,主要的Telephony 服務(IccSmsInterfaceManagerIccPhoneBookInterfaceManagerPhoneSubInfo )及數據連接功能都通過具體的Phone對象提供,具體的Phone對象包括CDMAPhone CDMALTEPhoneGSMPhoneSipPhone

                   PhoneBase抽象類是這些具體Phone對象的共同的基類,本身一個Handler 類,用來提供Phone 接口的基實現,PhoneBase通過CommandsInterface接口與RIL daemon 層交互,實現短消息提交、數據連接控制、ICC 信息讀取等Telephony 基類功能。PhoneBase包含SMSDispatcherDataConnectionTracker IccFileHandlerIccRecordsIccCard等幾個抽象類成員,并通過這些抽象類成員提供某一方面功能的基類實現。

                   SMSDispatcher DataConnectionTracker IccFileHandlerIccRecords抽象類也是派生自Handler類,因此都能夠向RIL 發送命令,接收和處理RIL發來的事件和命令應答。PhoneBase包括一個PhoneNotifier 接口, Phone對象本身及內部對象可以通過PhoneNotifier接口向應用發送Telephony事件通知。

                   CDMAPhoneGSMPhoneCDMALTEPhone三個具體的Phone 對象在默認的PhoneApp應用中調用PhoneFactorymakeDefaultPhone 函數根據不同的網絡模式進行單例實例化,并封裝進一個統一的PhoneProxy代理對象中。

                      sCommandsInterface = new RIL(context, networkMode, cdmaSubscription);

                          int phoneType = getPhoneType(networkMode);

                          if (phoneType == Phone.PHONE_TYPE_GSM) {

                              sProxyPhone = new PhoneProxy(new GSMPhone(context,

                                      sCommandsInterface, sPhoneNotifier));

                          } else if (phoneType == Phone.PHONE_TYPE_CDMA) {

                              switch (BaseCommands.getLteOnCdmaModeStatic()) {

                                  case Phone.LTE_ON_CDMA_TRUE:

                                  sProxyPhone = new PhoneProxy(new CDMALTEPhone(context,

                                          sCommandsInterface, sPhoneNotifier));

                                      break;

                                  case Phone.LTE_ON_CDMA_FALSE:

                                  default:

                                      sProxyPhone = new PhoneProxy(new CDMAPhone(context,

                                              sCommandsInterface, sPhoneNotifier));

                                      break;

                              }

                          }

                   PhoneProxy內部的對象成員mActivePhone指向代理的實際Phone 對象。PhoneProxy 代理對象實現了Phone接口,使應用能夠使用統一的PhoneProxy對象控制操作具體類型的 Phone 對象,而不用關心它們之間的差異(代理模式的采用),應用程序通過PhoneFactorygetDefaultPhone 函數返回統一的PhoneProxy代理對象來訪問不同的Phone對象。

                因為Telephony框架層支持不同的網絡類型的Telephony實現( CDMAGSM ),因此Telephony框架層普遍使用代理模式來對應用提供統一的服務接口。如PhoneProxy 代理對象內部還封裝了IccSmsInterfaceManagerIccPhoneBookInterfaceManagerPhoneSubInfo 三個服務的代理對象,通過代理對象提供對這三個服務的操作控制。

            public PhoneProxy(Phone phone) {

                  mActivePhone = phone;

                  mIccSmsInterfaceManagerProxy = new IccSmsInterfaceManagerProxy(

                          phone.getIccSmsInterfaceManager());

                  mIccPhoneBookInterfaceManagerProxy = new IccPhoneBookInterfaceManagerProxy(

                          phone.getIccPhoneBookInterfaceManager());

                  mPhoneSubInfoProxy = new PhoneSubInfoProxy(phone.getPhoneSubInfo());

                  mCommandsInterface = ((PhoneBase)mActivePhone).mCM;

              }

                 另外CommandsInterface接口的具體實現對象RILPhoneNotifier 接口的具體實現對象 DefaultPhoneNotifier也是在PhoneFactorymakeDefaultPhone中進行單例實例化。

                    CDMAPhoneGSMPhone對象直接派生自PhoneBase ,提供Phone 接口的具體實現,GSMPhoneGSM電話的JAVA 框架層實現,CDMAPhoneCDMA電話的JAVA框架層實現。

                    CDMAPhoneGSMPhone對象實例化時除實例化基對象PhoneBase 內部抽象對象(SMSDispatcherDataConnectionTrackerIccFileHandlerIccRecords IccCard)的具體類外,還實例化用于具體電話對象的Telephony服務(IccSmsInterfaceManager IccPhoneBookInterfaceManagerPhoneSubInfo三個服務或者服務的派生類)。

           GSMPhone

                  如下是GSMPhone對象的相關類圖。

           

                 

                   SMSDispatcher DataConnectionTracker IccFileHandlerIccRecordsIccCard等抽象類對應GSMPhone 對象中的派生類分別為 GsmSMSDispatcher(提供GSM模式的短消息發送和接收提交功能)、GsmDataConnectionTracker (提供 GSM模式的數據連接管理功能)、SIMFileHandler(提供SIM File處理)、SIMRecords (提供SIM信息記錄功能)、SimCard(提供SIM CARD功能);

                   IccSmsInterfaceManagerIccPhoneBookInterfaceManagerPhoneSubInfo 服務在GSMPhone 對象中實現的具體的服務類為 SimSmsInterfaceManager    SimPhoneBookInterfaceManagerPhoneSubInfo;這些對象和服務都在CDMAPhone對象實例化進行實例化。

                另外GSMPhone對象在實例化時還實例化GsmCallTracker(提供GSM 模式的CALL 管理)、GsmServiceStateTracker(提供GSM模式的服務狀態管理)、CatService 對象(提供STK服務)。

                  mCT = new GsmCallTracker(this);

                  mSST = new GsmServiceStateTracker (this);

                  mSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);

                  mIccFileHandler = new SIMFileHandler(this);

                  mIccRecords = new SIMRecords(this);

                  mDataConnectionTracker = new GsmDataConnectionTracker (this);

                  mIccCard = new SimCard(this);

                  if (!unitTestMode) {

                      mSimPhoneBookIntManager = new SimPhoneBookInterfaceManager(this);

                      mSimSmsIntManager = new SimSmsInterfaceManager(this, mSMS);

                      mSubInfo = new PhoneSubInfo(this);

                  }

                  mStkService = CatService.getInstance(mCM, mIccRecords, mContext, mIccFileHandler, mIccCard);

                   GSMCallTrackerAndroid的通話管理層,GsmCallTracker 派生自Handler 的虛擬類CallTrackerGsmServiceStateTracker派生自Handler 的虛擬類 ServiceStateTracker

                   GsmCallTrackerGsmServiceStateTracker對象分別提供Call 狀態( 共有IDLE, ACTIVE, HOLDING, DIALING, ALERTING, INCOMING, WAITING, DISCONNECTED, DISCONNECTING九種狀態) ServiceState (共有STATE_IN_SERVICESTATE_OUT_OF_SERVICESTATE_EMERGENCY_ONLY STATE_POWER_OFF四種狀態)的跟蹤和管理,能夠提供向RIL層發送請求,接收和處理RIL 層發來的命令響應事件及其它主動通知事件,如振鈴等CALL相關事件及Service狀態事件。

                   GsmCallTracker對象中還提供有三個GsmCall對象(派生自抽象類Call ):ringingCall (用來管理處于INCOMINGWAITING狀態的通話)、foregroundCall (用來管理處于DAILINGALERTINGACTIVE 狀態的通話)、backgroundCall (用來管理HOLD的通話)。

                    每個GsmCall可以同時有幾路connection ,因此GsmCall 對象內部包含一個Connection類型的ArrayList對象,用來維護每個CALL 擁有的connection,一個Call最大允許有5 connections

                   另外GSMCallTracker還包含一個GsmConnection 類型(派生自抽象類Connection)的數組對象Connections,用來維護所有的現行的通話的列表, GSMCallTracker 對象最大可維護7路通話。

                   GsmConnection對象中有個成員變量:GsmCall parent,這個成員變量是用來表示該connection 是屬于哪個 Call的,一個Call可以有多個Connection,但一個Connection 只能屬于一個Call

                   GsmServiceStateTracker對象中除了包括ServiceState狀態信息外,還包括SignalStrength 信號強度等信息。

                   GsmServiceStateTracker對象還維護GSM CELL位置信息, 因此包含兩個GsmCellLocation 對象成員cellLoc(當前位置) , newCellLoc( 新位置  )

                   GsmCallTrackerGsmServiceStateTracker維護的狀態和位置信息都通過RILRIL daemon 獲得,因此兩個對象都包括一個指向RILCommandsInterface對象。

                  CatService對象實現STK服務, 也是一個Handler對象,并實現AppInterface 接口。CatService 對象能夠與RILSTK應用交互:可以實現向RIL發送 Envelop 命令,以及RIL接收STK 事件,解析事件流(包括Proactive Command ,從STK應用接收命令執行結果編碼后發給RILCatService 對象采用一個RilMessageDecoder狀態機解析RIL發來的STK事件流。

           

           CDMAPhone

           

                如下是CDMAPhone對象的相關類圖。

                 

           

                   SMSDispatcher DataConnectionTracker IccFileHandlerIccRecordsIccCard等抽象類對應的CDMAPhone 對象中的派生類為CdmaSMSDispatcherCdmaDataConnectionTrackerRuimFileHandlerRuimRecordsRuimCard

                   IccSmsInterfaceManagerIccPhoneBookInterfaceManagerPhoneSubInfo 服務在CDMAPhone 對象中實現的派生類服務為 RuimSmsInterfaceManager    RuimPhoneBookInterfaceManagerPhoneSubInfo;這些對象和服務都在CDMAPhone對象實例化進行實例化。

                另外CDMAPhone對象在實例化時還實例化CdmaCallTracker CdmaServiceStateTracker CatService對象。以及一個EriManager對象用來加載ERI文件及管理CDMA漫游信息。

           

          public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier,

                      boolean unitTestMode) {

                  super(notifier, context, ci, unitTestMode);

                  initSstIcc();

                  init(context, notifier);

              }

           

              protected void initSstIcc() {

                  mSST = new CdmaServiceStateTracker(this);

                  mIccRecords = new RuimRecords(this);

                  mIccCard = new RuimCard(this, LOG_TAG, DBG);

                  mIccFileHandler = new RuimFileHandler(this);

              }

           

              protected void init(Context context, PhoneNotifier notifier) {

                  mCM.setPhoneType(Phone.PHONE_TYPE_CDMA);

                  mCT = new CdmaCallTracker(this);

                  mSMS = new CdmaSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);

                  mDataConnectionTracker = new CdmaDataConnectionTracker (this);

                  mRuimPhoneBookInterfaceManager = new RuimPhoneBookInterfaceManager(this);

                  mRuimSmsInterfaceManager = new RuimSmsInterfaceManager(this, mSMS);

                  mSubInfo = new PhoneSubInfo(this);

                  mEriManager = new EriManager(this, context, EriManager.ERI_FROM_XML);

                  mCcatService = CatService.getInstance(mCM, mIccRecords, mContext,

                          mIccFileHandler, mIccCard);

           

           

                   CdmaCallTracker提供CDMA電話的通話管理功能,提供CDMA Call 事件的處理,CdmaCallTracker 派生自Handler的虛擬類CallTracker,用來管理CALL 通話。和GsmCallTracker相同,CdmaCallTracker對象中也提供有三個CdmaCall 類型的Call 對象:ringingCallforegroundCallbackgroundCall

                每個CdmaCall也包含一個Connection類型的ArrayList 對象,用來維護每個CALL 擁有的connection,但一個CdmaCall最大只允許有1 connection。同樣CdmaCallTracker也包含一個CdmaConnection類型的數組對象Connections ,用來維護所有的現行的通話的列表,但Cdma最大也只允許1路現行通話。

                  CdmaServiceStateTracker派生自Handler的虛擬類ServiceStateTracker ,提供CdmaService 狀態的管理。 CdmaServiceStateTracker對象也維護CELL 位置信息, 因此和GsmServiceStateTracker相同包含兩個CdmaCellLocation對象成員cellLoc( 記錄CELL當前位置) , newCellLoc(記錄CELL 新的位置  ),用來記錄CELL位置信息。

          資源下載

          ?