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,每隔具體的會話都有一個具體的會話接口的或者會話客戶端的,大家沿着這樣的方向研究,框架基本就會弄的非常明白了,剩下的就是細節了。
恩,說的比較抽象,不懂的請樓下提問。