首先看ConnectionItem類,類的注釋是"抽象connection"我們是不是可以認(rèn)為它是在connection的層面上又抽象了一層,屬于connection的封裝,也就是說(shuō)這里還不是直接試用Smack的XMPPconnection的地方
ConnectionItem的幾個(gè)私有成員變量
private final ConnectionSettings connectionSettings;//Connection options.
private Connection ThreadconnectionThread;//XMPP connection.private boolean isConnectionRequestedByUser;Connection was requested by user.
private Connection Statestate;//Current state.
private boolean disconnectionRequested;//Whether force reconnection is in progress.
private boolean registerNewAccount;Need to register account on XMPP server.
公有的構(gòu)造器傳入了很多參數(shù),可以看出來(lái)是XMPP連接服務(wù)器的配置參數(shù),
并且初始化成員變量ConnectionSetting,參數(shù)傳了進(jìn)去,講成員變量初始化了
下面有一些獲取成員變量值的方法,
然后下面發(fā)現(xiàn)一個(gè)很重要的方法:
/**
* Connect or disconnect from server depending on internal flags.
*
*@paramuserRequestaction was requested by user.
*@returnWhether state has been changed.
*/
public booleanupdateConnection(booleanuserRequest)
這個(gè)方法主要代碼如果網(wǎng)絡(luò)不行就執(zhí)行自己的disconnect()和onClose()方法,否則初始化ConnectionThread成員變量調(diào)用它的start()方法;
這里可以知道連接服務(wù)器可能就寫在ConnectionThread的start()方法里
往下面看disconnect()方法里面直接調(diào)用了ConnectionThread.getConnection().disconnect()方法是斷開與XMPP連接的,
就這樣,我們找到頭緒了,所以直奔ConnectionThread的start()方法
然后在start()方法里面找到了私有方法新開一個(gè)線程運(yùn)行createConnection(fqdn,port,useSRVLookup);
createConnection方法里初始化了一個(gè)XmppConnectionConfiguration.builder對(duì)象,設(shè)置了一些連接服務(wù)器的參數(shù),并傳入onReady執(zhí)行
onReady(builder)除了初始化一些SSL屬性之外 使用了一個(gè)第三方項(xiàng)目MemorizingTrustManager
然后
xmppConnection=newXMPPTCPConnection(builder.build());
xmppConnection.addAsyncStanzaListener(this,ACCEPT_ALL);
xmppConnection.addConnectionListener(this);
然后注冊(cè)了一個(gè)AccountRosterListener一定是RosterListener咯~用來(lái)監(jiān)聽(tīng)聯(lián)系人狀態(tài)的
和一個(gè)PingFailedListener,到這里- -就找到了建立XMPP連接的代碼,
之后的分析可以在看了ConnectionThread的基礎(chǔ)上繼續(xù)分析,可以利用alt+F7來(lái)查看在那些地方用到了這個(gè)類,以至于發(fā)現(xiàn)在那些地方發(fā)生了建立連接