您的位置:首页 > 产品设计 > UI/UE

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

2016-01-01 17:08 417 查看

四.通话连接创建成功通知显示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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: