Android通话过程分析Word文档格式.docx

上传人:wj 文档编号:1450087 上传时间:2023-04-30 格式:DOCX 页数:11 大小:307.52KB
下载 相关 举报
Android通话过程分析Word文档格式.docx_第1页
第1页 / 共11页
Android通话过程分析Word文档格式.docx_第2页
第2页 / 共11页
Android通话过程分析Word文档格式.docx_第3页
第3页 / 共11页
Android通话过程分析Word文档格式.docx_第4页
第4页 / 共11页
Android通话过程分析Word文档格式.docx_第5页
第5页 / 共11页
Android通话过程分析Word文档格式.docx_第6页
第6页 / 共11页
Android通话过程分析Word文档格式.docx_第7页
第7页 / 共11页
Android通话过程分析Word文档格式.docx_第8页
第8页 / 共11页
Android通话过程分析Word文档格式.docx_第9页
第9页 / 共11页
Android通话过程分析Word文档格式.docx_第10页
第10页 / 共11页
Android通话过程分析Word文档格式.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Android通话过程分析Word文档格式.docx

《Android通话过程分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《Android通话过程分析Word文档格式.docx(11页珍藏版)》请在冰点文库上搜索。

Android通话过程分析Word文档格式.docx

这就说明GsmPhone和CdmaPhone其实都是一个Handler。

所以PhoneBase的子类是可以进行事件处理的。

3.Connection

Connection用来处理一个真正的通话通路,包含通话过程中call的数据,包括号码、通话时间、MT还是MO、是第几路通话、挂断原因等信息。

Connection类关系图:

GsmConnection中有个成员变量:

GsmCallparent,这个成员变量是用来表示该connection是属于哪个Call的。

由变量名(parent)可以看出Call与Connection的关系:

父与子的关系,一个Call可以有多个Connection(3gpp中规定最多5个),但一个Connection只能属于一个Call。

所以一个Connection必定要依附于一个Call。

Connection是怎样依附于一个Call的呢?

从Connection的构造方法中就可以知道:

a.GsmConnection(Contextcontext,DriverCalldc,GsmCallTrackerct,intindex)

这个构造方法是在MT的时候使用的,因为它有一个DriverCall的参数。

它通过parentFromDCState方法来获得对应的parent(Call)且通过parent.attach(this,dc);

把connection加入到Call的Connections变量进行管理。

b.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的。

4.DriverCall

是与ril层通信时的一个中间处理类,主要用来接收到ril的call数据后转到到java层上来。

DriverCall中包含了协议中规定的有关call的相关参数,具体如下:

publicintindex;

//ConnectionIndexforusewith,eg,AT+CHLD

publicbooleanisMT;

//是incoming还是outgoing

publicStatestate;

//connectionstate。

publicbooleanisMpty;

//nonzeroifismptycall。

publicStringnumber;

//Remotepartynumber

publicintTOA;

//typeofaddress,eg145=intl

publicbooleanisVoice;

//nonzeroifthisisisavoicecall

publicbooleanisVoicePrivacy;

//nonzeroifCDMAvoiceprivacymodeisactive

publicintals;

//ALSlineindicatorifavailable(0=line1)

publicintnumberPresentation;

//0=Allowed,1=Restricted,2=NotSpecified/Unknown3=Payphone

publicStringname;

//Remotepartyname

publicintnamePresentation;

5.CallTracker

CallTracker的类关系图:

从上图中可以看到,CallTracker在本质上是一个Handler。

CallTracker是一个抽象类,所以其实际的操作对象是其子类:

GSMCallTracker和CdmaCallTracker。

下面以GSMCallTracker为例介绍CallTracker的相关处理,CdmaCallTracker处理基本与之相同。

GSMCallTracker是Android的通话管理层。

GSMCallTracker建立了ConnectionList来管理现行的通话连接,并向上层提供电话调用接口。

1)Connections

Connections是GSMCallTracker用来维护所有的通话的列表,最大可维护7路通话。

staticfinalintMAX_CONNECTIONS=7;

//only7connectionsallowedinGSM

2)ringingCall、foregroundCall、backgroundCall

一个手机系统只允许3个Call同时存在,即ringcall、activecall和heldcall,所以GSMCallTracker用ringingCall、foregroundCall、backgroundCall来管理。

ringingCall:

用来管理INCOMING和WAITING的通话

foregroundCall:

用来管理DAILING、ALERTING、ACTIVE的通话

backgroundCall:

用来管理HOLD的通话

那么,ringingCall、foregroundCall、backgroundCall是如何来管理对应的call和connection的呢?

前面已经讲过了Call和Connection及它们之间的关系,其实系统中的Call是已经存在的,就是上面的3个,其实主要的是对于一个connection,它需要依附于那个call,由connection的构造方法知:

1)在从RIL获取的Calls列表的时候,通过parentFromDCState来获取相应的Call:

privateGsmCall

parentFromDCState(DriverCall.Statestate){

switch(state){

caseACTIVE:

caseDIALING:

caseALERTING:

returnowner.foregroundCall;

//break;

caseHOLDING:

returnowner.backgroundCall;

caseINCOMING:

caseWAITING:

returnowner.ringingCall;

default:

thrownewRuntimeException("

illegalcallstate:

"

+state);

}

}

2)在其他情况下,一般根据上面的状态直接传入对应的call。

3)GsmCallTracker中的事件处理机制

Call的事件处理基本上是请求应答模式,具体如下(以dail为例,其他类同):

其中涉及到3个变量的处理:

protectedintpendingOperations;

protectedbooleanneedsPoll;

protectedMessagelastRelevantPoll;

pendingOperations:

顾名思义,这个变量是在发生请求的时候会++,在处理应答的时候会--。

needsPoll:

该变量是用来配合pendingOperations处理是否需要从RIL获取当前calls列表,并更新connections列表。

lastRelevantPoll:

在发送RIL_REQUEST_GET_CURRENT_CALLS的时候记录最近一次请求的message,在response的时候只对最近一次请求的response做出响应,更新connections列表。

上面的3个变量主要是用来判断是否需要发送RIL_REQUEST_GET_CURRENT_CALLS请求来从RIL获取当前的calls列表,并更新connections列表。

GsmCallTracker事件处理的核心是一个异步事件的处理,在发送请求后等待回应的时候,用户有可能会继续的发送对应的请求,然后会有多个response同时上报过来,上面的3个变量主要是为了更好的处理这种情况,不管用户发送了多少次请求,pendingOperations都会记录下来;

而且只要用户发送了一次请求,needsPoll就为true,即就需要从RIL获取最新的call列表。

所以只有当pendingOperations==0并且needsPoll==true的时候才发送RIL_REQUEST_GET_CURRENT_CALLS请求去获取Calls列表。

if(pendingOperations==0&

&

needsPoll){

lastRelevantPoll=obtainMessage(EVENT_POLL_CALLS_RESULT);

cm.getCurrentCalls(lastRelevantPoll);

}

由于中间可能发送了多次RIL_REQUEST_GET_CURRENT_CALLS请求,在多次发送此请求的过程中却没有一次response回来,最后的结果是到最后肯定会有多个response上来,而此时我们只需要更新一次就够了,lastRelevantPoll就是用来处理这个事情的:

lastRelevantPoll记录了最近一次发送RIL_REQUEST_GET_CURRENT_CALLS请求时的responsemessage,当返回的responsemessage是最后一个时就更新Connections列表。

4)GsmCallTracker的核心处理方法----更新connections列表处理方法

protectedvoidhandlePollCalls(AsyncResultar)的处理分析

handlePollCalls(AsyncResultar){

ListpolledCalls;

if(DBG_POLL)log("

>

handlePollCalls"

);

if(ar.exception==null){

//没有异常,取得calllists列表

polledCalls=(List)ar.result;

}elseif(isCommandExceptionRadioNotAvailable(ar.exception)){

//如果radio是RADIO_NOT_AVAILABLE,则挂断所有的calls,这里的意思是所有的DriverCall是null。

polledCalls=newArrayList();

}else{

//其他的异常的话,推迟POLL_DELAY_MSEC=250后再发送//RIL_REQUEST_GET_CURRENT_CALLS去获取DriverCall列表。

pollCallsAfterDelay();

return;

}

ConnectionnewRinging=null;

//orwaiting

booleanhasNonHangupStateChanged=false;

//Anychangebesides

//adroppedconnection

booleanneedsPollDelay=false;

booleanunknownConnectionAppeared=false;

//遍历DriverCall和Connections,根据不同情况做相应处理。

for(inti=0,curDC=0,dcSize=polledCalls.size()

;

i<

connections.length;

i++){

GsmConnectionconn=connections[i];

DriverCalldc=null;

//polledCalllistissparse

if(curDC<

dcSize){

dc=(DriverCall)polledCalls.get(curDC);

//此处说明connections数组的index+1就是callId,也即dc.index。

if(dc.index==i+1){

curDC++;

}else{

dc=null;

if(conn==null&

dc!

=null){

//conn为null,说明CallTracker中是没有对应的call的,这只有两种情况可以//发生:

MO的dialing状态和MT的incoming/waiting状态。

打电话和来电的时候//会执行到此处。

}elseif(conn!

=null&

dc==null){

//说明在底层已经挂掉了,CallTracker需要drop该connection。

对方挂断电话//的时候就会执行到此处。

!

pareTo(dc)){

//此处说明对应的connection和dc并不是同一个call,这种情况下就需要drop//当前的connection并根据dc重新构建一个。

此处应该是一个异常的处理情况。

=null){

//此处表明connection和dc是同一个call,随后根据dc来更新connection。

if(REPEAT_POLLING){}

if(pendingMO!

//此时dial请求已经发送给ril但是对应的response还没有上来的情况。

正常情况//下,到此时pengdingMO应该为null了,但是假如在dial后的response还没有上//来的时候做了其他动作,如hangupcall,则此时很可能就执行到此处。

droppedDuringPoll.add(pendingMO);

pendingMO=null;

hangupPendingMO=false;

if(newRinging!

//表示是一个MTcall,需要通知用户。

phone.notifyNewRingingConnection(newRinging);

//clearthe"

localhangup"

and"

missed/rejectedcall"

//casesfromthe"

droppedduringpoll"

list

//Thesecasesneedno"

lastcallfail"

reason

for(inti=droppedDuringPoll.size()-1;

i>

=0;

i--){

GsmConnectionconn=droppedDuringPoll.get(i);

if(conn.isIncoming()&

conn.getConnectTime()==0){

//Missedorrejectedcall

Connection.DisconnectCausecause;

if(conn.cause==Connection.DisconnectCause.LOCAL){

cause=Connection.DisconnectCause.INCOMING_REJECTED;

cause=Connection.DisconnectCause.INCOMING_MISSED;

droppedDuringPoll.remove(i);

conn.onDisconnect(cause);

}elseif(conn.cause==Connection.DisconnectCause.LOCAL){

//Localhangup

conn.onDisconnect(Connection.DisconnectCause.LOCAL);

}elseif(conn.cause==

Connection.DisconnectCause.INVALID_NUMBER){

conn.onDisconnect(Connection.DisconnectCause.INVALID_NUMBER);

//Anynon-localdisconnects:

determinecause

if(droppedDuringPoll.size()>

0){

//本地挂断都是DisconnectCause.LOCAL,此处表明是对方或网络端的挂断,具体//挂断原因需要从RIL处获得。

cm.getLastCallFailCause(

obtainNoPollCompleteMessage(EVENT_GET_LAST_CALL_FAIL_CAUSE));

if(needsPollDelay){

//CaseswhenwecannolongerkeepdisconnectedConnection'

s

//withtheirpreviouscalls

//1)thephonehasstartedtoring

//2)ACall/Connectionobjecthaschangedstate...

//wemayhaveswitchedorheldoranswered(butnothun

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2