Android通话过程分析.docx
上传人:王子****青蛙 上传时间:2024-09-10 格式:DOCX 页数:11 大小:306KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

Android通话过程分析.docx

Android通话过程分析.docx

预览

免费试读已结束,剩余 1 页请下载文档后查看

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Android通话过程分析本文档主要对android平台下的call的实现做详细分析。Call处理的五大核心分别是:Call,Phone,CallTracker,DriverCall,ConnectionCallCall是Call应用中的最基本的单位,其主要是用来管理Connection的。Call中非常重要的是其状态,Call中共有九种状态:IDLE,ACTIVE,HOLDING,DIALING,ALERTING,INCOMING,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)且通过parent.attach(this,dc);把connection加入到Call的Connections变量进行管理。GsmConnection(Contextcontext,StringdialString,GsmCallTrackerct,GsmCallparent)这个构造方法是在MO的时候使用的,它会传入一个指定的parent(Call)且通过parent.attachFake(this,GsmCall.State.DIALING);调用把Connection加入到Call的Connections变量进行管理。从上面知道Connection调用了Call的2个重要的方法:Attach和attachFake。这两个方法都是把一个connection加入到Call的Connections成员变量中进行管理的。Call中还有一个方法detach(GsmConnectionconn),这个方法是用来把connection从Call中移除的。其中还有一个方法:/*package*/booleanupdate(DriverCalldc)。这个是用来更新connection的。DriverCall是与ril层通信时的一个中间处理类,主要用来接收到ril的call数据后转到到java层上来。DriverCall中包含了协议中规定的有关call的相关参数,具体如下:publicintindex;//Connection