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)
相关文章推荐
- Educational Codeforces Round 2 B. Queries about less or equal elements (二分)
- include(_once)与require(_once)
- JAVA图形界面(GUI)之布局管理器
- String | StringBuffer | StringBuilder 比较
- LeetCode96 Unique Binary Search Trees
- 形参个数可变, NSNumber和NSValue,获得Class
- <LeetCode OJ>Implement Stack using Queues【225】
- UIButton
- The requested URL /Users/add was not found on this server.
- android UI 优化之<viewstub>实现View的延迟加载
- Button 点击事件(参数)
- **Repeated DNA Sequences
- UIBarbutton点击事件问题
- Deep learning From Image to Sequence
- UILabel用法
- 【PAT】1007 Maximum Subsequence Sum (25) 最大连续子序列和 +记录位置
- emcee——Quickstart
- 项目管理神器——Confluence篇
- android UI 优化之<include>标签
- 关于UIView的autoresizingMask属性的研究