android wifi之 AsyncChannel类消息通道

来源:互联网 发布:外置dvd刻录机 知乎 编辑:程序博客网 时间:2024/05/01 06:24

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


原创粉丝点击