Telephony Call狀態圖解

CS call的工作狀態圖解

在分析Telephony的工作流程時,總是接觸到各種狀態的轉換,並且不同種類的狀態很容易讓人混淆,不知所措,本文根據工作中的記憶,根據圖示,簡要分析一下Telephony中的各種狀態。

Telephony中的幾種狀態。

圖1,DriverCall State/ Call State/ Phone State
這裏寫圖片描述

DriverCall State

DriverCall State是從RIL接口更新的狀態,它具有6個狀態,分別是:

  • ACTIVE,
  • HOLDING,
  • DIALING, // MO call only
  • ALERTING, // MO call only
  • INCOMING, // MT call only
  • WAITING; // MT call only
    正好對應Ril.h中的RIL_CallState。當下發RIL_REQUEST_GET_CURRENT_CALLS request後,DriverCall State會根據response攜帶的狀態信息更新自己的狀態。

Call State

在GSMCall中有三種Call:ringingCall,foregroundCall and backgroundCall. 也就是振鈴的電話,前臺電話,後臺電話。
每個Call最多有 5 個connections,但同時3個Call合起來不能超過7個connections。

Call State同樣包含DriverCall所具有的6個狀態,但同時Call還有3種狀態:
- IDLE
- DISCONNECTING
- DISCONNECTED
當Call 每次執行handlePollCalls時,會根據driver call來更新ACTIVE,HOLDING,DIALING, ALERTING,INCOMING,WAITING這6種狀態,但是對於IDLE, DISCONNECTING and DISCONNECTED這三種額外的狀態,就有一點複雜了。

IDLE:
如果一個Call是空的,那麼它就是在IDLE狀態,具體怎麼理解這個空的,往下看。
DISCONNECTING:
如果本機掛斷這個Call。這時Call會變成DISCONNECTING狀態,(如果是對方掛斷,Call是不會進入DISCONNECTING狀態的)

DISCONNECTED:
如果對方來電,但是這個connection因爲本地拒接(REJECTED)或者無人接聽(MISSED)。或者正在活動的connection因本地掛斷或者對方掛斷等原因中斷,又或者播出的電話是無效的。那麼這個connection就會被標記爲disconnected。
當一個Call只擁有disconnected的connections。那麼這個Call就被稱作DISCONNECTED。
而disconnected狀態的連接(connections)就會被移出Call的connections隊列,如果connections隊列變成了空的,那麼Call的狀態就會變成IDLE

Phone State

Phone State則是根據updatePhoneState方法,從Call State更新的。
如果振鈴呼叫(ringingCall)是處在INCOMING/WAITING狀態,這時Phone State就是RINGING狀態。

當一個call處於IDLE/ DISCONNECTED/ DISCONNECTING狀態時,被稱爲非激活的,如果不是處在這三種狀態時,就是激活的。
當一個去電對象(pendingMO)是非空的,或者前臺呼叫和後臺呼叫其中至少有一個是激活的。那麼這是Phone State 就是摘機(OFFHOOK)狀態。
如果Phone既不是RINGING狀態,也不是OFFHOOK狀態,則處於IDLE狀態。

下圖展示了Phone State和Call State的相互轉化狀態圖。
這裏寫圖片描述

注意:只有本地掛斷會導致DISCONNECTING狀態,對方掛斷或者信號原因導致的斷開,會直接跳到Disconnected狀態。(本圖中沒有體現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章