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然后再发送了消息。