Android网络框架

WifiManager

WifiManager用于暴露给用户操作WIFI,上层APP通常可以按照下面的方法获取WifiManager,然后就可以根据开放的函数操作WIFI。

val mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE)

上面的获取函数我们可以跟踪它的实现,发现它就是从一个map中根据Context.WIFI_SERVICE取出WifiManger对象的:

Android网络框架_第1张图片 ContextImpl.java

Android网络框架_第2张图片 SystemServiceRegistry.java​

 同样的,我们可以发现WifiManager对象的创建也是再这个类里面,在一个static代码段里面运行了下面这段代码,即在类被加载到时就创建了WifiManager并且注册到了上面的map中,我们可以看到在WifiManger创建时把WifiService的引用传了进去,实际上用户调用WifiManger时,所有对WIFI的操作都是走到了WifiService(WifiServiceImpl)。

Android网络框架_第3张图片

 WifiService

WifiService是在SystemService中被启动的,我们可以在SystemService中看到main函数,然后一直走到创建WifiService:main() -> run() -> startOtherService() -> startService(WIFI_SERVICE_CLASS)。

Android网络框架_第4张图片

Android网络框架_第5张图片 SystemServer.java

 WifiService实际就是个简单的包装类,真正的实现都是由WifiServiceImpl类来实现,并且发布到ServiceManager中的也是WifiServiceImpl类,所以上面WifiManager中持有的是WifiServiceImpl,对Wifi的调用也都是走到的WifiServiceImpl。

Android网络框架_第6张图片 WifiService.java

 WifiServiceImpl

上面说到了WifiManager暴露出来的所有关于wifi的操作都是由WifiServiceImpl实现的,这里我们先看一下他们的通信方式,第一种是是远程服务的直接调用,跟平时使用AIDL是一样的。

Android网络框架_第7张图片

 第二种是通过AsyncChannel的方式,这种方式可以很方便的实现跨进程互相调用。

Android网络框架_第8张图片 WifiManager.java

 上面的Message会发送到WifiServiceImpl,而WifiServiceImpl处理好又会回调到WifiManager。

Android网络框架_第9张图片 WifiServiceImpl.java

 上面的回调的消息会在WifiManager的内部类ServiceHandler中收到并处理。

WifiServiceImpl对Wifi的操作,主要是通过WifiController实现,WifiController是一个状态机(TODO状态改变怎么发送到底层)。

你可能感兴趣的:(android)