1.1 通话去电流程框架介绍

概述:Android5.1相对于以往的平台对通话功能做了很大程度上的修改,在这里,差异性我们到最后去分析,我们先看通话去电的大概结构,在这之前我先提出几点疑问,比如通话过程不可避免涉及到通话连接,整个通话架构是建立在通话连接之上,只有建立了通话连接之后,很多功能比如接听挂断才能真正实现,那么第一点我们就要知道这个通话连接是在什么时候创建,创建完了之后又有了什么动作,通话界面在什么时候什么地方被显示启动,是通过广播启动还是其他方式?通话连接创建和每路通话的保存的先后顺序是怎样的,异步还是同步,这些问题都很值得研究,接下来就基于这几点做重点解析。

在这里我们选择从拨号盘拨号开始。

1.拨号键盘拨号时触发DialpadFragment.java(packages/apps/Dialer)中的handleDialButtonPressed方法,调用:

final Intent intent = CallUtil.getCallIntent(number,
      (getActivity() instanceof DialtactsActivity ?
((DialtactsActivity) getActivity()).getCallOrigin() : null));
DialerUtils.startActivityWithErrorToast(getActivity(), intent);
    hideAndClearDialpad(false);

前面的逻辑主要处理了号码不符合要求的情况,在这里跟踪代码即可知道,得到的action是CALL_PRIVILEGED,最后进入的是telecomm层的CallActivity.java,在这里做了一个中转,然后进入CallReceiver.java中的processOutgoingCallIntent()中,在这里要注意进入的不是outgoingBroadcaster.java,5.0/5.1之后都是走的telecomm来处理通话;

2.拨号流程中从CallActivity.java接收到广播开始转发到CallReceiver.java中接收到拨号请求:

Call call = getCallsManager().startOutgoingCall(handle, phoneAccountHandle, clientExtras);
if (call != null) {
NewOutgoingCallIntentBroadcaster broadcaster = new NewOutgoingCallIntentBroadcaster(context, getCallsManager(), call, intent, isDefaultDialer);
final int result = broadcaster.processIntent();
final boolean success = result == DisconnectCause.NOT_DISCONNECTED;
if (!success && call != null) {
   disconnectCallAndShowErrorDialog(context, call, result);
  }
}

这里需要解释一下,从这一步开始往下通话去电分成了两路进程,分别是:

a.CallsManager调用 startOutgoingCall开始显示通话界面流程:具体包括了每路通话的保存处理,状态保存,通话界面显示的预处理,以及发送AT指令至底层实现物理拨号;

b.创建去电通话连接:众所周知,通话的必须提交是必须要先建立通话连接才能实现真正的通话,通话连接会设置对方号码,然后等待底层调用实现双方连接通话;

接下来我们具体分析每路进程要做的工作以及这两路流程之间的联系。

Android5.1 Telecomm层通话去电流程两路进程分析之一通话去电流程框架介绍相关推荐

  1. hive执行流程(3)-Driver类分析1Driver类整体流程

    Driver类是对 1 org.apache.hadoop.hive.ql.processors.CommandProcessor.java 接口的实现,重写了run方法,定义了常见sql的执行方式. ...

  2. Android结合源码分析Power按键处理流程

    这是之前团队进行技术交流时,我选择的一个主题,那段时间解决power锁屏按键的bug,搞得头大,所以借此机会结合Android8.0源码去分析Power键的处理流程,也将此分享出来,希望对大家有所帮助 ...

  3. activiti学习(二十一)——流程虚拟机源码分析(三)——从进入到离开userTask

    前言 承接上文<activiti学习(二十)--流程虚拟机源码分析(二)--从开始节点离开到下个节点前>,假设execution接下来进入的节点是userTask,本文分析一下进入user ...

  4. CC2538 ZigBee 芯片 两路UART串口同时使用

    前言 众所周知,CC2538 zigbee芯片物理上支持UART0和UART1,但是在Z-Stack协议栈里面只提供了UART1的代码支持,并没有提供UART0的代码支持,但是具体如何同时使用UART ...

  5. 从语音通话和视频通话两个方面搭建专属于自己的私有化部署的视频会议通话系统

    召开远程视频会议,可大大提高工作效率,节省与会人员的工作时间和会议费用.视频会议通话系统应用在政府.军队.教育.金融.交通.能源.医疗等行业及跨国.跨地区的企业中逐步普及. EasyRTC视频通话系统 ...

  6. 两个企业级产品设计思路:流程效率指标功能生命周期长度

    最近又一轮的创投圈资本寒冬到来,以往依靠融资进行持久战的引流,拉用户,广告变现这一漫长的C端打法已经不再被资本市场所推崇,而是转变为追求如何快速变现,一单就有一单钱的短投资周期模式.而此时B端产品的优 ...

  7. 计算机网络基础(传输层和它的两个朋友TCP、UDP)(传输层【上】)

    目录 UDP和TCP UDP UDP首部 TCP TCP报文段的首部格式 TCP的三次握手和四次挥手 传输层协议和应用层协议之间的关系 注意的网络安全 修改服务器默认端口 只开放必要端口 UDP和TC ...

  8. Android5.0源码分析—— Zygote进程分析

    1      Zygote简介 Android的应用程序一般都是由Java语言编写而成的,这样的应用程序需要运行在独自的Dalvik虚拟机之上(当然,5.0好像默认了ART了).但是,如果在每一个进程 ...

  9. 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. aws lambda使用_使用AWS Lambda安排Slack消息
  2. 织梦最新版后台一键更新网站、更新文档HTML卡死的解决方法
  3. 洛谷P1001 A+B Problem
  4. Spring Cloud实战小贴士:Zuul处理Cookie和重定向
  5. docker从容器里面拷文件到宿主机或从宿主机拷文件到docker容器里面
  6. u-boot移植随笔:让u-boot shell支持tab、命令历史
  7. Vivado 2017封装自定义IP Core
  8. Php的入栈,PHP实现的栈数据结构示例【入栈、出栈、遍历栈】
  9. Windows7系统设置相对路径快捷方式
  10. 计算机网络树形结构例子,网络拓扑结构大全和实例
  11. 管理学论文对人性的假设
  12. sessionStorage和localStorage
  13. linux网络本地发送lo性能,LINUX网络性能之管理工具三剑客
  14. 分析测试电视遥控总结
  15. Android中按钮的点击事件的四种写法
  16. 【VAR | 时间序列】应用VAR模型时的15个注意点
  17. vue——VM对象和基础指令
  18. Python(Tuirtle库)绘制五星红旗详细画法
  19. 采购外系统——POC的重要性
  20. 火狐/谷歌浏览器打开开发者模式的三种方法

热门文章

  1. react前端下载后端返回文件流(文件流下载excel、csv)
  2. 带隔离变压器的DC/DC单端正激变换电路设计与Simulink仿真
  3. c++ stl stack(FILO,容器配接器)
  4. 华为要做视频?苏杰称只是配合终端不涉足内容
  5. python安装cv2包报错解决方法
  6. 快速的把ppt转换成word用什么转换
  7. Hybrid beamforming 下 MSE 的推导
  8. python 4399别踩白块儿脚本
  9. 文献阅读记录(2)— PointNet++论文学习
  10. 微信小程序云开发——实现 线上注册,登录的逻辑,并保存账号到云数据库( 二 ):注册