Telephony Call状态图解
CS call的工作状态图解
当我们深入研究Telephony的工作流程时
Telephony中的几种状态。
图1,DriverCall State/ Call State/ Phone State

DriverCall State
DriverCall State是从RIL接口更新的状态,它具有6个状态,分别是:
准确对应于Ril.h中的RIL_CallState。
当发起发送RIL_REQUEST_GET_CURRENT_CALLS请求时,
DriverCall State将根据response所携带的状态信息更新自身的状态。
Call State
在GSMCall中存在三种类型的电话呼叫:振铃呼叫、主叫通话和副叫通话。即振铃的电话、用于主叫的通话以及用于后台操作的通话。每个电话呼叫最多可连接5个通信链路;然而三个不同的呼叫组合总共最多只能支持7个通信链路。
与DriverCall共有的六个状态外,Call State还包括三种特殊的状态:IDLE、DISCONNECTING和DISCONNECTED。每当HandlePollCalls被调用时,默认情况下会根据相应的driver call触发其状态的变化。值得注意的是,在处理IDLE、DISCONNECTING以及DISCONNECTED这三个特殊状态下时会更加复杂。
IDLE:
如果某个Call处于空的状态,则表示该Call处在IDLE状态下,请继续阅读下去以了解相关细节。
DISCONNECTING:
当本地设备断开该Call时,则称此行为发生了变化:此时该Call将进入DISCONNECTING状态;值得注意的是,在这种情况下(即本地设备发生断裂),对方不会触发此操作。
DISCONNECTED:
当接通时,如果对方来电但因本地端拒绝或无人接听的情况发生;或者正在进行中的连接因本地端或对方端挂断等原因中断;又或者播出电话号码无效等情况出现,则会将此connection标记为disconnected状态。
一个Call若仅包含处于disconnected状态的所有connections,则该Call的状态标记为DISCONNECTED。
而所有连接均处于disconnected状态之下的call则会将其所有的 connections从其call对象联系列表中删除掉。当联系列表为空时,则表示相应的call处于IDLE状态。
Phone State
Phone State则由updatePhoneState方法驱动,并基于Call State进行更新。
若振铃呼叫(ringingCall)处于INCOMING或WAITING的状态,则Phone State则为RINGING状态。
当一个call处于IDLE、DISCONNECTED或DISCONNECTING这三个状态之一时,则被视为非活跃态;只有当call不在上述任何一种状态下时,则被认为是活跃态。
如果一个去电对象(pendingMO)不为空,并且在前台呼叫与后台呼叫中至少有一个属于活跃态,则该手机处于摘机(OFFHOOK)状态。
若手机的状态既不是RINGING也不是OFFHOOK,则其运行状态为IDLE。
下图展示了Phone State和Call State的相互转化状态图。

注意:只有本地挂断会导致DISCONNECTING状态,对方挂断或者信号原因导致的断开,会直接跳到Disconnected状态。(本图中没有体现)
AI写代码
