`
talent2012
  • 浏览: 8740 次
社区版块
存档分类
最新评论

android. 4.4 MT(来电)流程

阅读更多
先来看看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(来电)的整个流程,但很多细节地方还值得推敲。
分享到:
评论

相关推荐

    9500 S4 RECOVERY 版本6.0.4.4

    最新版的recovery,版本6.0.4.4,可以用

    glm-0.9.4.4

    在“glm-0.9.4.4”这个版本中,我们看到的是GLM的一个较早但稳定版的发布。这个库提供了一系列与数学相关的数据结构和函数,包括向量、矩阵、四元数以及其他几何和线性代数操作。 GLM的主要目标是成为OpenGL开发者...

    QHierarchy v.4.4 Unity.zip

    《QHierarchy v.4.4 for Unity:提升游戏开发中的层级管理效率》 Unity引擎作为全球最广泛使用的3D游戏开发平台之一,其强大的功能和易用性深受开发者喜爱。然而,随着项目规模的扩大,游戏对象的层级管理可能会变...

    TongWeb7.0.4.4管理控制台未授权访问目录补丁.zip

    东方通7版本可能会出现在控制台中部署服务时,无法查看除/home目录外的其他目录,导致只能把war包、jar包等相关文件放在/home路径下,此补丁可解决此问题;更新后,可正常到访问服务器所有路径中的文件。

    WebOffice控件weboffice_v6.0.4.4

    WebOffice控件是一款用于网页端实现文档在线预览、编辑和转换的技术组件,其版本号为v6.0.4.4。这个控件的主要功能是提供一个浏览器内的交互式平台,让用户能够在不依赖本地软件的情况下,处理各种常见的办公文档...

    Android.4.4Telephony

    Android 4.4(KitKat)版本对Telephony模块进行了优化和改进,使得开发者可以更高效地利用这个框架进行应用开发。下面将详细介绍Android 4.4 Telephony的知识点: 1. **PhoneService**:这是Android Telephony的...

    sipdroid.4.4.apk

    android android android android 视频通话 sipdroid.4.4.apk

    The.Design.and.Implementation.of.the.4.4BSD.Operating.System PDF格式

    - 系统启动流程 2. **内核组织**:深入讨论了4.4BSD内核的组织结构,包括不同模块之间的交互方式及其实现细节。 - 内核模块划分 - 模块间通信机制 - 内核初始化过程 3. **内核服务**:阐述了内核提供的各种...

    Android 4.4 来电响铃流程图

    文章:《Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程》中涉及的时序图 http://blog.csdn.net/yihongyuelan/article/details/24640819

    recovery-clockwork-6.0.4.4-i9300

    recovery clockwork 6.0.4.4 i9300 三星9300第三方recovery6.0.4.4版本

    TongWeb7.0.4.4_Standard_Linux.tar.gz

    【TongWeb7.0.4.4_Standard_Linux.tar.gz】是一个针对Linux操作系统的国产中间件软件包,由标题可知,这是TongWeb中间件的7.0.4.4版本的标准版。中间件在IT行业中扮演着至关重要的角色,它提供了应用服务器的功能,...

    Design.And.Implementation.Of.The.4.4.Bsd.Operating.System pdf

    Design.And.Implementation.Of.The.4.4.Bsd.Operating.System

    Microsoft Fiddler 2.3.4.4.exe

    Microsoft Fiddler 2.3.4.4.exe

    QHierarchy v.4.4 Unity.unitypackage

    QHierarchy v.4.4 Unity.unitypackage

    Universal-USB-Installer-1.9.4.4

    而"Universal-USB-Installer-1.9.4.4.exe"则是实际的可执行文件,运行此程序即可启动UUI的安装或制作USB启动盘的流程。 在制作Linux USB启动盘时,有几点需要注意: 1. **备份数据**:在开始之前,请确保USB驱动器...

    Alpha 1_3.1.4.4.apk.1

    Alpha 1_3.1.4.4.apk.1

    com.google.gdt.eclipse.suite.4.4.update.site_3.9.5.zip

    标题中的"com.google.gdt.eclipse.suite.4.4.update.site_3.9.5.zip"是一个Google为Eclipse IDE创建的更新站点压缩包,版本号为3.9.5,针对的是Eclipse 4.4(代号Luna)平台。这个插件集主要目的是扩展Eclipse的功能...

    Python库 | atom3_py3-0.1.4.4-py3-none-any.whl

    而"atom3_py3-0.1.4.4-py3-none-any.whl"是一个特定的Python库,名为`atom3`的版本为0.1.4.4的轮子文件。 “轮子”(wheel)是Python的二进制包格式,它是Python包索引(Python Package Index, PyPI)上的一种常见分发...

    vagaa_vod_2.6.4.4skycn

    描述中的“好,下载速度快,安装方便”进一步确认了Vagaa的主要优势:提供高速的下载体验以及简单的安装流程。在P2P网络中,Vagaa利用多源下载技术,允许用户同时从多个节点获取数据,从而显著提高了下载速度。而...

    GiWiFiAssist-1.1.4.4-setup.exe

    GiWiFiAssist-1.1.4.4-setup.exe

Global site tag (gtag.js) - Google Analytics