0
点赞
收藏
分享

微信扫一扫

Android Telephony通话状态更新消息上报流程


Android Telephony通话状态更新消息上报流程_消息处理

Telephony通话消息上报流程

通话相关代码名称统一约定以及运行进程:

通话相关代码名称统一约定及运行进程汇总

路径

统称

进程

packages/app/Dialer

Dialer

com.android.dialer

packages/service/telecomm

telecom

system_service

packages/service/telephony

TeleService

com.android.phone

framework/base/telecomm

framework

无进程只是提供调用framwork

framework/opt/Telephony

telephony

system_service或com.android.phone

首先拨号流程和来电流程分析在前几篇中写道过​​来电流程​​,​​拨号流程​​。

拨号成功后,对方接听了此路通话,那么通话界面将更新当前通话中的通话状态,并开始通话计时,可以理解为:Modem——>RIL——>TeleService——>Telecom——>Dialer,一层一层上报通话状态为,“通话中....”,的消息处理和发送过程.

流程图:

Android Telephony通话状态更新消息上报流程_消息处理_02

这里需要关注几个重点

三个应用的Call信息传递

         TeleService应用首先接收到通话状态更新的消息,通过framework/Telecom(framewrok)的Adapter服务设置不同的状态(步骤11(传入的是Id));接着service/Telecom(telecom)应用跟更新Call状态(步骤13,步骤14);最后Telecom掉了用IInCallSerivce的updateCall接口更新Call状态

RegistrantList消息处理

步骤2步骤3,在GsmCdmaPhone对象发出RegistranList消息通知后,在TelephonyConnection对象的mHandler匿名内部类对象的handlerMessage中响应MSG_PRECISE_CALL_STATE_CHANGED类型的Handler消息,该Handler消息的注册入口在TelephonyConnection抽象类的两个子类GsmConnectionh和CdmaConnection的setOriginalConnection方法中实现注册MSG_PRECISE_CALL_STATE_CHANGED类型的Registran,并在GsmConnection的构造方法中调用setOriginalConnection接口进行消息注册的初始化操作;而TelephonyConnection对象在TelephonyConnectionService类的onCreateOutgingConnection和onCreateIncommingConnection方法中创建。

TelephonyConnection对象的Listener注册

步骤10:通过Listener对象的onStateChanged进行消息回调,那么Listener对象是什么?有是在什么地方注册的?是在ConnectionService的createConnection方法中,首先创建TelephonyConnection对象,然后调用addConnection方法,设置当前类的私有内部类Connection.Listener对象mConnectionListener为TelephonyConnection对象的Listener

IConnectionServiceAdapter接口汇总

IConnectionServiceAdapterd的Stub接口实现在Telecom应用ConnectionServiceWrapper类的私有内部类Adapter中,它主要由setActive,setRinging,setAudioRoute等设置Call相关状态信息的接口,以及onConnectionEvent,onRttInitiationSuccess,onRemoteRttRequest等消息通知接口构成

IInCallService接口汇总

IICallSerivce的Stub接口实现了framework/base下的InCallService抽象类的私有内部类InCallServiceBinder中,他主要由setInCallAdapter,addCall,updateCall等增加和更新Call对象相关的接口,以及onConnectionEvent,onCallAudioStateChanged等消息通知接口。而在Dialer应用中,InCallServiceImpl继承了抽象类InCallService

Android通话模型,Dialer,Telepcom和TeleService三个系统应用主要负责的业务及运行进程空间,结合这四个通话的核心流程,可以抽象出模型,可以站在更高的层次去认识和理解Android Telephony通话功能。

Android Telephony通话状态更新消息上报流程_Android_03

系统的分层 

       Dialer,Telecom和TeleService三大应用可以理解为:Dialer应用是普通的Android  App应用,其运行进程的用户信息和进程信息,也能说明此问题;Telecom应用运行在system_service进程上,其进程用户名为system系统用户,说明他在运行在Android Framework框架层;TeleService应用运行的进程名是com.android.phone,用户名是radio,承载着Telephony Call协议栈,同样可以认为他运行在Android Framewrok框架层;最后RIL他运行在HAL(硬件抽象层)。

交互方式

      Dialer,Telecom,TeleService和RIL都是通过服务进行交互的,在图中,他们之间有箭头连接的都是通过Service跨进程的接口调用实现的。Dialer与TeleService之间没有直接的消息传递,要通过Telecom进行消息中转,Telecom与RIL直接同样没有直接的消息传递,要通过TeleService进行消息中转。

       通过服务进行跨进程接口调用实现消息的传递,服务接口调用本身就是同步的接口调用,在Service端的实现将转换为异步方式处理,待消息处理完成后,在使用回调的接口传递消息处理的结果

分解通话相关流程

根据消息的传递方向,可分成两大类

        第一类 控制通话消息下发流程 : 应用层通过框架层向RIL发起通话管理和控制相关RIL请求,RIL转换成对应的消息发发送给Modem执行,其中包括拨号,接听电话,拒接电话,保持,恢复通话等。

       第二类 为通话状态更新消息上报流程 :RIL收到的Modem的通话状态变化通知,通过框架层向应用层发起通话状态变化通知,包括来电,电话接通,进入通话中等。

举报

相关推荐

0 条评论