Sipdroid註冊(三)-註冊返回結果的監聽

看Sipdroid的源碼,發送註冊message後,是如何實現對註冊返回結果進行監聽的?

Sipdroid的數據發送流程是這樣的:
http://www.shouyanwang.org/thread-5-1-1.html

先直接給大家說下結果:
對註冊結果的監聽是通過RegisterAgent來進行監聽的,因爲RegisterAgent實現了TransactionClientListener接口,通過
/**
  * When the TransactionClient goes into the "Completed" state receiving a
  * 2xx response
  */
public void onTransSuccessResponse(TransactionClient tc, Message resp);
函數即可實現對返回結果的監聽。


那麼按照Sipdroid的數據發送流程,最終獲取到得結果是會傳遞到SipProvider中的onReceiverMessage()接口方法中,那麼如何來實現將OnReceiverMessage中獲取到的結果傳遞到RegisterAgent中呢?

這裏其實還真的挺佩服涉及Sipdroid架構的哥們的,大量的運用回調和接口來進行數據的轉發.

註冊的流程是這樣的:
RegisterAgent--register(int time)

register函數主要幹兩件事情,一是生成註冊消息的message,另一個就是發送這個message,
message可以看http://www.shouyanwang.org/thread-35-1-1.html這篇文章

message發送成功後,那麼就得發送,發送是通過:
//TransactionClient t
  t = new TransactionClient(sip_provider, req, this, 30000);
  t.request();
來完成的,request函數中有兩行代碼非常重要:

sip_provider.addSipProviderListener(transaction_id, this);
  connection_id = sip_provider.sendMessage(request);

sip_provider發送消息後,通過onReceiveMessage來接受消息,接受消息後就會進行一件事情的判斷,通過判斷髮送message的transaction_id來判斷此前發送的請求是用來註冊,還是用來進行會要的邀請呢?transaction_id其實就是一個標識,標識會話類型的,會話類型包括:註冊,通話請求等等,然後在onReceiveMessage中進行判斷。

SipProvider中有如下的一個參數:
/** List of provider listeners */
Hashtable<Identifier, SipProviderListener> listeners = null;

listeners裏面含有的對應關係爲會話標識符----會話接口,比如註冊過程就是註冊會話標識符對應註冊會話接口,所以只要是會話類型那麼必然要實現會話接口SiproviderListener,會話有很多種,比如註冊會話,通話會話,視頻會話,那麼Sipdroid的開發者就提取了他們的共同點,封裝成了一個抽象的會話類型:

public abstract class Transaction implements SipProviderListener, TimerListener;

具體的會話都必須繼承Transaction,Transaction默認的已經繼承了SipProviderListener。

所以呢,具體的數據最終會返回到具體的會話類中,註冊的會話類是:TransactionClient,在TransactionClient中通過OnReceiverMessage就可以獲得服務器返回的註冊應答的數據,那麼如果TransactionClient如何將應答的數據返回給RegisterAgent呢?

在TransactionClient初始化的時候
t = new TransactionClient(sip_provider, req, RegisterAgent.this, 30000);

RegisterAgent將自己作爲TransactionClientListener傳進了TransactionClient中,那麼咱們就只需要在TransactionClient的onReceiverMessage中通過調用TransactionListener的onTransProvisionalResponse(this, msg),數據就返回到了RegisterAgent呢。

理解了其實就非常的簡單,大的脈絡基本就不會偏差,以後所有的會話基採取的這樣的一套模式,每個會話都會繼承Transaction,每隔具體的會話都有一個具體的會話接口的或者會話客戶端的,大家沿着這樣的方向研究,框架基本就會弄的非常明白了,剩下的就是細節了。

恩,說的比較抽象,不懂的請樓下提問。



轉自http://www.shouyanwang.org/thread-44-1-1.html

發佈了14 篇原創文章 · 獲贊 3 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章