Android5.1 Telecomm层通话去电流程两路进程分析之四通话连接创建成功通知显示InCallUI

四.通话连接创建成功通知显示InCallUI

上面介绍了如何创建通话连接以及调用了l.onSuccessfulOutgoingCall去通知前台显示通话界面,那么具体是如何通知的呢?在这里我们继续分析一下具体的connection创建成功后是如何通知显示通话界面的:

 

a.我们看到在创建通话连接成功后回去调用onSuccessfulOutgoingCall方法,其中有个setCallState方法,之前我们讲过,最后保存通话记录时也是通过此方法,那么这个方法中还有一个关键所在就是下面一行代码:

 

call.setState(newState);

 

看条件是如果newState !=oldState就执行上面一行,作用就是保存call的一个状态,看log可以查到最后成功保存的是OUTGOING;

 

b.我们回到以前说过的的显示界面的过程,最后走到Phone层去调用CallList的onCallAdded方法判断是去电还是来电,如果是去电就调用onUpdate(call)方法:

 

onUpdateCall(call);

notifyGenericListeners();

 

看onUpdateCall方法回去调用updateCallInMap方法做这么一件事:

mCallById.put(call.getId,call);

 

这里会将当前的call实例放入键值对列表mCallById中,注意这个call里面的state在上面已经保存过了,接着会调用上面的notifyGenericListeners():

 

listener.onCallListChange(this);

 

这个会直接去调用InCallPresenter.java中的onCallListChange方法,这个方法最终回去调用:

 

InCallState newState =getPotentialStateFromCallList(callList);
InCallState oldState = mInCallState;
newState = startOrFinishUi(newState);

 

这个getPotentialStateFromCallList方法就是从CallList.java中的上面保存过的call实例中取出其state然后复制给newState ,然后调用startOrFinishUi()去做判断,如果newState  ==OUTGOING就去做显示incallui的动作了,也就是说创建连接成功后另一路进程(就是CallsManager.java的startOutgoingCall()方法走的那路进程,本来是两路,这是其中一路,而另一路就是现在做的创建通话连接的过程,这两者其实最后靠的是Call的state进行联系,前一路走到一定的节点就在等通话连接创建成功,一旦成功就会显示通话界面)就一直在等这个状态,状态设置为OUTGOING即表示时机成熟了,可以去通知显示通话界面了。

 


总结:

通过以上a,b两步我们知道在通话过程中是先建立连接connection后再去显示incallui的,连接建立完成后会回调onSuccessfulOutgoingCall方法中的:

setCallState(call, callState);//这一步是为了在创建好连接后保存当前的通话记录以及call的状态

然后调用call.setState()方法去设置状态,然后CallList一直去轮询call的状态,直到连接创建成功,状态改成OUTGOING后才去显示incallui,这样,整个流程就清晰了,即:拨号-->建立连接-->连接建立成功-->流转到底层进行物理拨号-->返回底层RIL拨号成功标志-->保存通话记录-->显示incallui

在这里我们大概的介绍了拨号流程中的两路进程,即第一通过CallsManager去显示通话界面,第二创建通话连接,以及详解了这两路的相关性,接下来我们具体分析这两路进程是如何具体实现的,即通话连接真正的建立过程和拨号通过CallsManager往下都走了哪些流程,是怎么去保存每路通话的。
注(小流程): 
CallActivity-->CallReceiver-->CallsManager.startOutgoingCall 
                             | 
                             -->NewOutgoingCallIntentBroadcaster-->CallsManager.placeOutgoingCall(创建连接connection)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值