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

你可能感兴趣的:(Sipdroid注册(三)-注册返回结果的监听)