Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android telephone 4.2 framework層分析

android telephone 4.2 framework層分析

編輯:關於Android編程

framework層的相關代碼主要在GSMPhone、CallManager、GSMCallTracker、TelePhonyManager中。

GSMPhone:

與GSMPhone關聯的主要是Phone.java、PhoneBase.java、GSMPhone.java。Phone作為基類,定義了25對Handler消息注冊和注銷的接口,而PhoneBase繼承Phone實現了24對,還有一對在GSMPhone中實現,而GSMPhone繼承了PhoneBase。

如何管理Phone對象的呢?在應用層的PhoneApp中調用PhoneFactory的靜態方法makeDefaultPhones創建Phone對象,而framework中采用的是代理模式和工廠模式實現,在makedefaultPhone中,創建了PhoneProxy,參數為GSMPhone或者CDMAPhone對象,通過PhoneProxy間接的訪問GSMPhone,增加了安全性。

GSMPhone繼承了PhoneBase,而PhoneBase中繼承了Handler。使用了RegistrantList的消息處理機制,注冊和注銷Handler消息,並且發送notifyXXX方法發出多個注冊的通知。在應用層中獲取當前Phone的狀態,getForegroundCall、getBackgroundCall、getRingingCall,實際獲取的是GSMPhone中的mCT即CallTracker的屬性。

CallTracker 通話管理

主要功能在GSMCallTracker中實現,GSMCallTracker繼承CallTracker,CallTracker繼承Handler,因此GSMCallTracker的handleMessage接收CallTracker的消息。GSMCallTracker類主要提供兩大處理能力:

1、通話控制能力,如撥號、接聽來電、拒接、多方通話(conference)和交換通話(switchWaitingOrHoldingAndActive),最終都會調用operationComplete方法,完成了通話管理和控制操作,該方法中也會查詢Call List通話列表,在接收到EVENT_CALL_STATE_CHANGE方法後(即通話狀態變化後),調用pollCallsWhenSafe方法,查詢當前CallList的通話列表。

2、Handler消息處理邏輯。接收的來自RIL對象cm的消息,包括通話狀態的變化、無線通信模塊Modem或者Radio開啟、無線通信模塊關閉或不可用狀態,以及接收CallTracker的消息。

流程如下:

CallManager可以被上層調用,它運行於framework層,接著調用GSMPhone的mCT對象調用dial、acceptCall等控制通話,Calltracker中會調用cm的控制方法,cm為RIL層的對象,RIL層處理完畢後,發起EVEMT_OPERATION_COMPLETE消息,在GSMCallTracker中處理,調用operationComplete,調用RIL的cm對象查詢Call List列表,RIL層查詢完畢後,發起EVENT_POLL_CALLS_RESULT消息,GSMCallTracker處理消息,調用handlePollCalls處理,更新通話狀態並且發出相關的消息通知。

GSMCall的通話管理模型:

GSMCall中包含state狀態和connections通話連接列表。GSMConnection保存了通話連接的基本信息,多個GSMConnection對象組成一路通話,而GSMCall管理state和connections,一路通話中有多個通話連接,即多方通話。

handlePollCalls方法:

通過接收到的Message消息,獲取Call List,對象,強制轉化為List對象,這時保存的實際上是DriverCall,RIL層的對象。匹配connections和DriverCall List中對應的DriverCall對象。dc.index== i++;conn表示老的通話連接,而dc表示新的通話連接。

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved