先来看看MT(来电)的整个流程图:
通过上图可以知道,整个MT(来电)过程分为三个部分:Telephony framework、TeleService、InCallUI。来电信息通过处理并逐层传递,最终显示到界面上。界面主要包括:CallCardFragment、CallButtonFragment、AnswerFragment内容的更新。
Telephony framework处理
通过RILReceiver接收到MT(来电)信息,RILC将相关来电信息通过socket发送给RILJ,RILReceiver接收到之后进行读取并打包进行上报。整个流程如下图:
整个过程看起来比较清晰,这里运用到了观察者模式也就是RegistrantList和Registrant,使用handler来传递信息。
通过观察者模式,消息逐步传递到了GsmCallTracker中,在这里一方面继续将信息向上传递,另一方面这里调用了updatePhoneState()方法,该方法最后会使用broadcast的方式,发出TelephonyManager.ACTION_PHONE_STATE_CHANGE的广播,该广播用于通知Phone状态改变,API中提供监听PhoneState改变的广播就是这里负责通知的。
TeleService消息处理
经过Telephony framework中的各种处理后,来电信息就传递到了TeleService中。在TeleService中会查询来电号码的信息,比如归属地,是否是已知联系人等,将这些查询到的消息保存到Connection对象中,再将其传递给InCallUI进行最后的显示。整个处理流程如下:
TeleService在后台负责相关数据的查询和获取,InCallUI负责取出TeleService中的数据并进行界面显示更新。这里的CallStateMonitor正如其名,用于注册监听Phone的状态改变并统一发起通知。CallNotifier和CallModeler均添加了CallStateMonitor的Listener,一旦Phone状态改变即可通过Handler的handleMessage回调到相关注册类中,并进行一些处理。
在来电的时候除了有EVENT_NEW_RINGING_CONNECTION,还有EVENT_PRECISE_CALL_STATE_CHANGED和EVENT_INCOMING_RING等,每一个状态对应一种处理。这些状态在CallManager中处理之后便通过CallStateMonitor进行回调处理。
startIncomingCallQuery()方法负责查询来电号码的相关信息,CallModeler将查询结果放入Connection对象中,并触发Listener的回调方法onIncoming()。CallModeler中包含了很多重要的方法,CallModeler继承自Handler,CallHandlerServiceProxy注册了其Listener,CallModeler处理完Connection之后会回调到CallHandlerServiceProxy中。
进入了CallHandlerServiceProxy中,通过其名称我们大致可以推断是一个代理类。它主要完成信息的传输,代码如下:
2. public void onIncoming(Call call) {
3. // 清空重链接计数.
4. resetConnectRetryCount();
5. synchronized (mServiceAndQueueLock) {
6. if (mCallHandlerServiceGuarded == null) {
7. if (DBG) {
8. Log.d(TAG, "CallHandlerService not connected. Enqueue incoming.");
9. }
10. //设置操作类型为QueueParams.METHOD_INCOMING
11. enqueueIncoming(call);
12. //与InCallUI中的CallHandlerService建立连接,使用bindService
13. setupServiceConnection();
14. return;
15. }
16. }
17. //第二次再处理来电信息,第一次如果没有建立连接则会先执行上面的代码
18. processIncoming(call);
19. }
整个过程分解为以下三步:
(1). 设置界面处理类型;
因为这里是来电,因此类型为QueueParams.METHOD_INCOMING。
1. enqueueIncoming(call);
2. private void enqueueIncoming(Call call) {
3. getQueue().add(new QueueParams(QueueParams.METHOD_INCOMING, new Call(call)));
4. }
(2). 与CallHandlerService建立连接;
使用的是bindService来建立Service的连接。
1. if (!mContext.bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE)) {
2. // This happens when the in-call package is in the middle of being installed
3. Log.w(TAG, "Could not bind to default call handler service: " + serviceIntent.getComponent());
4. failedConnection = true;
5. }
(3). 处理来电操作processIncoming;
执行上面两步之后会return,但来电信息并不是只有一次上报,因此在建立CallHandlerService连接之后再执行processIncoming。
1. private void processIncoming(Call call) {
2. //... ...省略
3. synchronized (mServiceAndQueueLock) {
4. if (mCallHandlerServiceGuarded != null) {
5. mCallHandlerServiceGuarded.onIncoming(call,
6. RejectWithTextMessageManager.loadCannedResponses());
7. }
8. //... ....省略
9. }
10.
11. private void onCallHandlerServiceConnected(ICallHandlerService callHandlerService) {
12. //... ...省略
13. mCallHandlerServiceGuarded = callHandlerService;
14. //... ...省略
15. }
16.
17. onCallHandlerServiceConnected(ICallHandlerService.Stub.asInterface(service));
通过以上步骤之后所以的数据已经获取完毕,接下来需要更新界面UI了。
InCallUI界面更新
经过前面Telephoney framework和TeleService处理之后,已经获取到了UI界面所需要的数据,在InCallUI中要做的仅仅是将相关数据更新的界面上。整个流程如图:
在CallHandlerService中,首先会执行onIncoming()方法,并进而跳转到CallList中。
1. mCallList.onIncoming(entry.getKey(), entry.getValue());
这里的CallList包含了各种call的处理方法,并将处理结果通知感兴趣的类( 也就是注册了其Listener的类 ),主要是InCallPresenter。这里还会去更新call的id信息,这个id信息存储在HashMap中,比如当需要使用或者查找call可以根据id来查找,CallList主要是对Call进行列表化。
在完成call列表化之后便会通知相应的presenter,这里是MT(来电)流程。所以主要涉及到两个presenter即AnswerPresenter和InCallPresenter。前者负责来电接听/拒接控件的更新显示,后者负责CallCard和CallButton以及VTCall ( MTK加入的VideoCall )的界面更新显示。
通过CallCardPresenter中的onStateChange()方法,回调到CallCardFragment,并使用ui.setXXX()方法设置界面元素的内容
小结
MT(来电)从Modem端发起,最终显示到界面上,整个过程的传递大致可以分为以下三个步骤:
1. Telephony framework处理;
主要对来电信息进行初步加工与分类。
2. TeleService处理;
完成对Telephony framework加工后的消息进行记录登记,并获取显示界面所需要的各种数据。
3. InCallUI界面显示更新
接收TeleService传递过来的更新请求,并将相关联系人数据更新到界面上。
虽然简单的将MT(来电)流程分成了三个部分,但通过代码的查看可以知道,在此过程中有很多分支。比如:来电响铃,Notification通知等等,这些都属于MT(来电)流程的一部分, 虽然简单的理清了MT(来电)的整个流程,但很多细节地方还值得推敲。
分享到:
相关推荐
文章:《Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程》中涉及的时序图 http://blog.csdn.net/yihongyuelan/article/details/24640819
文章《Android 4.4 Kitkat Phone工作流程浅析(五)__MT(来电)流程分析》中涉及的时序图 http://blog.csdn.net/yihongyuelan/article/details/21953045
报告不仅详细记录了问题现象,而且深入探讨了来电流程中的各个组件和它们之间的交互,并通过日志分析具体定位到问题可能发生在InCallUI处理消息的环节。最后,报告还提出了可能的改进方向,以便更好地优化用户体验。
uniapp实战商城类app和小程序源码,包含后端API源码和交互完整源码。
本课程是 PHP 进阶系列之 Swoole 入门精讲,系统讲解 Swoole 在 PHP 高性能开发中的应用,涵盖 协程、异步编程、WebSocket、TCP/UDP 通信、任务投递、定时器等核心功能。通过理论解析和实战案例相结合,帮助开发者掌握 Swoole 的基本使用方法及其在高并发场景下的应用。 适用人群: 适合 有一定 PHP 基础的开发者、希望提升后端性能优化能力的工程师,以及 对高并发、异步编程感兴趣的学习者。 能学到什么: 掌握 Swoole 基础——理解 Swoole 的核心概念,如协程、异步编程、事件驱动等。 高并发处理——学习如何使用 Swoole 构建高并发的 Web 服务器、TCP/UDP 服务器。 实战项目经验——通过案例实践,掌握 Swoole 在 WebSocket、消息队列、微服务等场景的应用。 阅读建议: 建议先掌握 PHP 基础,了解 HTTP 服务器和并发处理相关概念。学习过程中,结合 官方文档和实际项目 进行实践,加深理解,逐步提升 Swoole 开发能力。
matlab齿轮-轴-轴承系统含间隙非线性动力学 基于matlab的齿轮-轴-轴承系统的含间隙非线性动力学模型,根据牛顿第二定律,建立齿轮系统啮合的非线性动力学方程,同时也主要应用修正Capone模型的滑动轴承无量纲化雷诺方程,利用这些方程推到公式建模;用MATLAB求解画出位移-速度图像,从而得到系统在不同转速下的混沌特性,分析齿轮-滑动轴承系统的动态特性 程序已调通,可直接运行 ,关键词:Matlab;齿轮-轴-轴承系统;含间隙非线性动力学;牛顿第二定律;动力学方程;修正Capone模型;无量纲化雷诺方程;位移-速度图像;混沌特性;动态特性。,基于Matlab的齿轮-轴-轴承系统非线性动力学建模与混沌特性分析
2024年移动应用隐私安全观测报告.pdf
本电影评论网站管理员和用户。管理员功能有个人中心,用户管理,电影类别管理,电影信息管理,留言板管理,论坛交流,系统管理等。用户可以对电影进行评论。因而具有一定的实用性。本站是一个B/S模式系统,采用SSM框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得电影评论网站管理工作系统化、规范化。 本系统的使用使管理人员从繁重的工作中解脱出来,实现无纸化办公,能够有效的提高电影评论网站管理效率。 关键词:电影评论网站;SSM框架;MYSQL数据库 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1 MYSQL数据库 2 2.2 B/S结构 3 2.3 Spring Boot框架简介 4 3系统分析 4 3.1可行性分析 4 3.1.1技术可行性 4 3.1.2经济可行性 5 3.1.3操作可行性 5 3.2系统性能分析 5 3.2.1 系统安全性 5 3.2.2 数据完整性 6 3.3系统界面分析 6 3.4系统流程和逻辑 7 4系统概要设计 8 4.1概述 8 4.2系统结构 9 4.
2023-04-06-项目笔记-第四百三十六阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.434局变量的作用域_434- 2025-03-13
基于STM32的流量计智能流速流量监测、水泵报警系统(泵启动 1100027-基于STM32的流量计智能流速流量监测、水泵报警系统(泵启动、阈值设置、LCD1602、超阈值报警、proteus) 功能描述: 基于STM32F103C8单片机实现的智能流速、流量,流量计设计 实现的功能是通过信号发生器模拟齿轮传感器,检测流量的大小,同时计算流过液体的总容量 可以设置最大流过的总容量,当超过设定值后通过蜂鸣器与LED灯指示 当没有超过则启动水泵控制电路带动液体流动 1、流速检测 2、流量统计 3、阈值显示与设置(通过按键实现阈值的调节或清零) 4、水泵启动 5、超阈值报警 有哪些资料: 1、仿真工程文件 2、PCB工程文件 3、原理图工程文件 4、源代码 ,核心关键词: 基于STM32的流量计; 智能流速流量监测; 水泵报警系统; 阈值设置; LCD1602; 超阈值报警; Proteus仿真; STM32F103C8单片机; 齿轮传感器; 信号发生器; 流量统计; 蜂鸣器与LED灯指示; 水泵控制电路。,基于STM32的智能流量监测与报警系统(阈值可调、流速与流量监
(灰度场景下的平面、海底、船、受害者)图像分类数据集【已标注,约1100张数据】 数据经过预处理,可以直接作为分类网络输入使用 分类个数【4】:平面、海底、船、受害者【具体查看json文件】 划分了训练集、测试集。存放各自的同一类数据图片。如果想可视化数据集,可以运行资源中的show脚本。 图像分类、分割网络改进:https://blog.csdn.net/qq_44886601/category_12858320.html 计算机视觉完整项目:https://blog.csdn.net/qq_44886601/category_12816068.html
arkime无geo下的oui文件
人脸识别项目实战
人脸识别项目实战
CAD 2025 二次开发dll
人脸识别项目源码实战
c语言学习
基于扩张状态观测器eso扰动补偿和权重因子调节的电流预测控制,相比传统方法,增加了参数鲁棒性 降低电流脉动,和误差 基于扩张状态观测器eso补偿的三矢量模型预测控制 ,基于扩张状态观测器; 扰动补偿; 权重因子调节; 电流预测控制; 参数鲁棒性; 电流脉动降低; 误差降低; 三矢量模型预测控制,基于鲁棒性增强和扰动补偿的电流预测控制方法
c语言学习
UE开发教程与学习方法记录.zip