首页 > 代码库 > android telephone 4.2 framework层分析
android telephone 4.2 framework层分析
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表示新的通话连接。