1.wifiMonitor和wifiService是wifi的核心。
2.wifiMonitor的startMonitoring()方法開啟了一個新的線程,不停的接受來自wpa_supplicant的事件,而wifiStateStackTrace的startMonitoring則是注冊了一個廣播,允許接收來自stateMachine的廣播,繼而將 NetWorkInfo以Message的形式發送給了connectivityService的handler在進行相應的處理。
3.AsyncChannel類
看說明文檔這個類是一個處理兩個handler之間 消息異步傳遞的問題,這兩個handler可以在一個進程也可以處於不同的進程,與Messenger的使用方法十分類似都是通過service的aidl機制實現不同進程之間的數據共享。首先關於該類的connect()方法是在wifiService的WifiStateMachineHandler內部類里面調用的,且很多方法都在WifiStateMachine方法里面調用。
該類里面有個輔助類SyncMessenger是用來發送同步消息的,從該類的成員變量可知,它存儲了一個消息棧,然后從棧的頂部開始將消息取出並發送給對應的handler,成員變量有sStack棧,它通過 sendMessageSynchronously()方法發送消息並將發送的消息放到棧頂(不會重復,若重復刪除先前的message),並掉用了object類的wait方法將鎖沒有釋放這道目的handler收到消息后,取出消息中的replyto(保存的是SyncMessenger類中的SyncHandler內部類的messenger實例),然后再用該messenger信使給SyncMessenger類中的SyncHandler發送消息在該handler的handleMessage方法里面才執行object的notify方法,以保證發送消息的同步性。
在該類里面還有一內部類AsyncChannelConnection,它是implements了ConnectService接口,該接口是在connectSrcHandlerToPackageSync()函數里bind進去的,源碼如下:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName(dstPackageName, dstClassName);
boolean result = srcContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
其中參數mConnection就是該接口實例化后的一個對象。
下來看AsyncChannel類的幾個主要方法:
(1)public void connect(Context srcContext, Handler srcHandler, String dstPackageName,String dstClassName)
該方法中后兩個參數代表:dstPackageName包中的dstClassName服務中onBind()方法返回的binder對象的messenger的remoteHandler。然后向srcHandler發送一個Message,其what參數為CMD_CHANNEL_HALF_CONNECTED。源碼如下:
Message msg = mSrcHandler.obtainMessage(CMD_CHANNEL_HALF_CONNECTED);
msg.arg1 = status;
msg.obj = this;
msg.replyTo = mDstMessenger;
mSrcHandler.sendMessage(msg);
replyTo參數放的是remoteHandler的信使messenger,方便在srcHandler的handleMessage方法里面通過messenger向remoteHandler再發送message。
(2)public void connect(AsyncService srcAsyncService, Messenger dstMessenger)
作用同(1),這次的dstMessenger= new Messenger(remoteHandler),而AsyncService也是新版才加進來的類,AsyncService類里面有getHandler()方法返回該service里面的handler,而抽象方法createHandler是空方法需要重寫,由繼承的類來完成相應的創建handler方法。該服務的oncreate方法調用了createHandler方法創建了handler,其他用法同service類。
(3)public void connect(Context srcContext, Handler srcHandler, Handler dstHandler)
作用同(1),只是這次的reomteHandler是dstHandler,srcHandler不變。
(4)下面貼上第四個函數的源碼:
public void sendMessage(Message msg) {
msg.replyTo = mSrcMessenger;
try {
mDstMessenger.send(msg);
} catch (RemoteException e) {
replyDisconnected(STATUS_SEND_UNSUCCESSFUL);
}
}
這次是將(1)中兩個handler的作用調換了。
(5)public Message sendMessageSynchronously(Message msg)
public Message sendMessageSynchronously(Message msg) {
Message resultMsg = SyncMessenger.sendMessageSynchronously(mDstMessenger, msg);
return resultMsg;
}
它直接調用了內部類SyncMessenger的sendMessageSynchronously()方法,至於這個內部類在上面已經做了詳盡的描述。
(6)replyToMessage(Message msg)
public void replyToMessage(Message srcMsg, Message dstMsg) { try { dstMsg.replyTo = mSrcMessenger; srcMsg.replyTo.send(dstMsg); } catch (RemoteException e) { } }
可以看出replyToMessage就是在mSrcMessenger的handler收到消息后告訴AsyncChannel類說收到消息了,然后再取出srcMsg(mSrcMessenger)中的mDstMessenger再發送消息 ,這個函數相當與一個中轉站它轉換了handler然后再發送了消息。
