Android通话过程分析本文档主要对android平台下的call的实现做详细分析。Call处理的五大核心分别是:Call,Phone,CallTracker,DriverCall,ConnectionCallCall是Call应用中的最基本的单位,其主要是用来管理Connection的。Call中非常重要的是其状态,Call中共有九种状态:IDLE,ACTIVE,HOLDING,DIALING,ALERTING,ING,WAITING,DISCONNECTED,DISCONNECTING;对call的处理实际上是对状态转换上的处理。对这九中状态所对应的含义和call此时的现状要很熟。Call的继承关系图:Call是一个抽象类,从图中可知,实际操作是在其子类GsmCall和CdmaCall。在GsmCall中,有个成员变量:connections,这个变量是用来管理Call中的connection的,一个Call最大允许有5个connections:staticfinalintMAX_CONNECTIONS_PER_CALL=5;//only5connectionsallowedpercallPhonePhone不仅是call的处理核心,而且是整个Telephony处理的核心。Phone是一个最基本的概念,用来控制Phone系统相关(即无线相关的)模块的处理:simcard,call,message,datacall等。Phone的继承关系如下:在Phone的继承关系中可知,Phone只是一个接口,它被PhoneBase和PhoneProxy实现,而PhoneBase是抽象类,它被GsmPhone和CdmaPhone继承。所以有此可知Phone分为两类:GsmPhone和CdmaPhone。PhoneBase还有另外一个继承关系:继承自Handler。这就说明GsmPhone和CdmaPhone其实都是一个Handler。所以PhoneBase的子类是可以进行事件处理的。ConnectionConnection用来处理一个真正的通话通路,包含通话过程中call的数据,包括号码、通话时间、MT还是MO、是第几路通话、挂断原因等信息。Connection类关系图:GsmConnection中有个成员变量:GsmCallparent,这个成员变量是用来表示该connection是属于哪个Call的。由变量名(parent)可以看出Call与Connection的关系:父与子的关系,一个Call可以有多个Connection(3gpp中规定最多5个),但一个Connection只能属于一个Call。所以一个Connection必定要依附于一个Call。Connection是怎样依附于一个Call的呢?从Connection的构造方法中就可以知道:GsmConnection(Contextcontext,DriverCalldc,GsmCallTrackerct,intindex)这个构造方法是在MT的时候使用的,因为它有一个DriverCall的参数。它通过parentFromDCState方法来获得对应的parent(Call)(this,dc);把connection加入到Call的Connections变量进行管理。GsmConnection(Contextcontext,StringdialString,GsmCallTrackerct,GsmCallparent)这个构造方法是在MO的时候使用的,它会传入一个指定的parent(Call)(this,);调用把Connection加入到Call的Connections变量进行管理。 从上面知道Connection调用了Call的2个重要的方法:Attach和attachFake。这两个方法都是把一个connection加入到Call
Android通话过程分析 来自淘豆网m.daumloan.com转载请标明出处.