Telephony 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狀態。(本圖中沒有體現)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章