本文简要介绍WIFI服务的主要框架以及运作机制
。
在这里通过SystemServiceManager将WIFI的主服务(WifiService)启动,然后来看该Service的启动过程:
以上是WifiService的全部内容,其实该Service只完成了两个任务:
1、在初始化时,也就是构造方法中,创建WifiServiceImpl对象。
2、在onStart时,将WifiServiceImpl对象注册到ServiceManager中。
这里创建的WifiServiceImpl是整个WIFI服务的管理者,他负责将客户端对WIFI的请求分类,然后派发给不同的处理中心。
下面先来看WifiServiceImpl的属性:
这说明该类是一个服务的实现类。
然后来看该对象的初始化过程,也就是构造方法:
在这里初始化各种与WIFI管理有关的辅助类,其中包含最重要的一个就是WIFI的状态机WifiStateMachine,他是整个WIFI机制的核心。下面来看该状态机的初始化流程:
我们看到,在WifiStateMachine的初始化过程中创建了大量的辅助类,其中就包括NetworkInfo,他的作用就是标记当前网络的各项属性,比如当前网络的类型、是否可用、是否处于漫游等,然后还创建了许多WIFI的状态机,标识当前WIFI所处的状态,最后将状态机初始状态设置为mInitialState,并将状态机start。
以上就是WifiService的全部初始化过程,其主要过程分为以下四个部分:
1、在SystemServer中启动WifiService;
2、在WifiService启动过程中创建并初始化WifiServiceImpl;
3、在WifiServiceImpl初始化过程中创建并初始化WifiStateMachine对象;
当系统初始化时, 会在Context对象的实现类ContextImpl中注册一些常用的服务,这样就可以在应用内部通过Context对象的getSystemService()方法来获取相应的服务 。而WIFI在ContextImpl中注册了WifiManager用于向一般应用提供WIFI的服务:
从这里可以知道两个信息:
1、应用可以通过Context对象的getSystemService(Context.WIFI_SERVICE)的方法获取到一个WifiManager的对象用于控制WIFI;
2、WifiManager的创建需要使用ServiceManager的WIFI_SERVICE服务,而这个WIFI_SERVICE就是在WifiService中注册的WifiServiceImpl对象;
下面来看WifiManager的创建过程:
从上面WifiManager的初始化过程中我们看到,其初始化的过程中完成了以下两个任务:
1、用WifiServiceImpl初始化mService对象;
2、向WifiServiceImpl申请单向的AsyncChannel(想要连接AsyncChannel请点击这里);
至此,WIFI框架就完成了所有需要初始化的动作,我们用一张流程图来标识该过程:
以下是WifiManager提供的几个比较重要的对外接口:
我们挑选两个比较典型的方法进行跟踪,分别是:控制WIFI开关的setWifiEnabled()和连接某个WIFI的connect()方法。
我们继续跟踪上面两个方法的调用流程来查看WifiServiceImpl的处理过程。
先来看setWifiEnabled()方法,该方法是直接由WifiManager调用到WifiServiceImpl中的,其实现如下:
在这里我们看到,WifiServiceImpl将请求转交给WifiController来处理。
下面来看WifiManager中connect()方法的处理,当初WifiManager收到该请求后,通过AsyncChannel的方式向WifiServiceImpl发送CONNECT_NETWORK的请求,那么WifiServiceImpl的接下来就需要在自己的Messenger中处理,而这个Messenger是从getWifiServiceMessenger()中传递给WifiManager的,我们来看是哪个Messenger来处理该请求:
从这里看到,WifiManager拿到的Messenger中的Handler其实就是mClientHandler,他是在WifiServiceImpl初始化时被创建的:
也就是说WifiManager通过AsyncChannel发送的消息都会在ClientHandler中接收到:
从上面这个处理来看,WifiServiceImpl将请求转交给WifiStateMachine来处理。
其实WifiServiceImpl对请求的处理与WifiManager类似,他本身并不具备处理事物的能力,只是将请求分类后交由不同的处理者去处理 。
以上就是整个WIFI框架的初始化以及内部消息处理机制,下面用一张图来标识WIFI内部的消息流:
WIFI框架主要涉及到以下几个对象:WifiService、WifiManager、WifiServiceImpl、WifiStateMachine等。下面来介绍这四个对象的内在联系。
一、WIFI服务的初始化
WIFI服务的初始化分为两个部分,WifiService的初始化和WifiManager的初始化,下面分别介绍。
1.1、WifiService的初始化流程
在这里通过SystemServiceManager将WIFI的主服务(WifiService)启动,然后来看该Service的启动过程:
以上是WifiService的全部内容,其实该Service只完成了两个任务:
1、在初始化时,也就是构造方法中,创建WifiServiceImpl对象。
2、在onStart时,将WifiServiceImpl对象注册到ServiceManager中。
这里创建的WifiServiceImpl是整个WIFI服务的管理者,他负责将客户端对WIFI的请求分类,然后派发给不同的处理中心。
下面先来看WifiServiceImpl的属性:
这说明该类是一个服务的实现类。
然后来看该对象的初始化过程,也就是构造方法:
在这里初始化各种与WIFI管理有关的辅助类,其中包含最重要的一个就是WIFI的状态机WifiStateMachine,他是整个WIFI机制的核心。下面来看该状态机的初始化流程:
我们看到,在WifiStateMachine的初始化过程中创建了大量的辅助类,其中就包括NetworkInfo,他的作用就是标记当前网络的各项属性,比如当前网络的类型、是否可用、是否处于漫游等,然后还创建了许多WIFI的状态机,标识当前WIFI所处的状态,最后将状态机初始状态设置为mInitialState,并将状态机start。
以上就是WifiService的全部初始化过程,其主要过程分为以下四个部分:
1、在SystemServer中启动WifiService;
2、在WifiService启动过程中创建并初始化WifiServiceImpl;
3、在WifiServiceImpl初始化过程中创建并初始化WifiStateMachine对象;
4、在WifiStateMachine初始化过程中创建各种状态机并启动他们;
1.2、WifiManager的初始化流程
当系统初始化时, 会在Context对象的实现类ContextImpl中注册一些常用的服务,这样就可以在应用内部通过Context对象的getSystemService()方法来获取相应的服务 。而WIFI在ContextImpl中注册了WifiManager用于向一般应用提供WIFI的服务:
从这里可以知道两个信息:
1、应用可以通过Context对象的getSystemService(Context.WIFI_SERVICE)的方法获取到一个WifiManager的对象用于控制WIFI;
2、WifiManager的创建需要使用ServiceManager的WIFI_SERVICE服务,而这个WIFI_SERVICE就是在WifiService中注册的WifiServiceImpl对象;
下面来看WifiManager的创建过程:
从上面WifiManager的初始化过程中我们看到,其初始化的过程中完成了以下两个任务:
1、用WifiServiceImpl初始化mService对象;
2、向WifiServiceImpl申请单向的AsyncChannel(想要连接AsyncChannel请点击这里);
至此,WIFI框架就完成了所有需要初始化的动作,我们用一张流程图来标识该过程:
二、WIFI服务的运作机制
以下是WifiManager提供的几个比较重要的对外接口:
我们挑选两个比较典型的方法进行跟踪,分别是:控制WIFI开关的setWifiEnabled()和连接某个WIFI的connect()方法。
为什么要挑选这两个方法呢?是因为这两个方法分别使用两种方式与WifiService进行通讯。
2.1、setWifiEnabled方式
2.2、connect方式
2.3、WifiManager小结
我们可以这样理解WifiManager:他是WIFI模块向外部应用透漏出来的接口,其他所有应用都可以通过WifiManager操作WIFI各项功能,但是WifiManager本身并不具备处理请求的能力,而是把所有请求转发给WifiServiceImpl对象,而发送请求的方式就是直接调用或者通过AsyncChannel。
2.4、WifiServiceImpl中对请求的处理
我们继续跟踪上面两个方法的调用流程来查看WifiServiceImpl的处理过程。
先来看setWifiEnabled()方法,该方法是直接由WifiManager调用到WifiServiceImpl中的,其实现如下:
在这里我们看到,WifiServiceImpl将请求转交给WifiController来处理。
下面来看WifiManager中connect()方法的处理,当初WifiManager收到该请求后,通过AsyncChannel的方式向WifiServiceImpl发送CONNECT_NETWORK的请求,那么WifiServiceImpl的接下来就需要在自己的Messenger中处理,而这个Messenger是从getWifiServiceMessenger()中传递给WifiManager的,我们来看是哪个Messenger来处理该请求:
从这里看到,WifiManager拿到的Messenger中的Handler其实就是mClientHandler,他是在WifiServiceImpl初始化时被创建的:
也就是说WifiManager通过AsyncChannel发送的消息都会在ClientHandler中接收到:
从上面这个处理来看,WifiServiceImpl将请求转交给WifiStateMachine来处理。
其实WifiServiceImpl对请求的处理与WifiManager类似,他本身并不具备处理事物的能力,只是将请求分类后交由不同的处理者去处理 。
以上就是整个WIFI框架的初始化以及内部消息处理机制,下面用一张图来标识WIFI内部的消息流: