### WiFi模块分析 #### 一、WiFi模块启动流程 ##### 1. **系统启动初始化** - **触发入口**: 在系统启动过程中,通过`SystemServer`加载各种系统服务,其中包括WiFi服务。这一过程从获取`ConnectivityService`实例开始。`ConnectivityService.java`位于`/framework/base/services`目录下。 - **初始化过程**: 在系统启动的`init2()`方法中,调用了`ServerThread.start()`,从而启动了一系列服务的初始化过程,其中包括`ConnectivityService`的创建。创建`ConnectivityService`实例的过程是通过其内部的`getInstance()`方法实现的。 ##### 2. **启动ConnectivityThread线程,创建ConnectivityService实例** - **创建线程**: 调用`getInstance()`方法后,内部通过`ConnectivityThread.getServiceInstance(context)`获取`ConnectivityService`实例。在此过程中创建了`ConnectivityThread`线程并启动它。 - **创建服务实例**: 在启动线程的`run()`方法中创建了`ConnectivityService`实例。 ##### 3. **根据系统网络配置启动WiFi模块** - **网络配置**: 创建`ConnectivityService`实例时,会读取系统配置的网络属性,即`com.android.internal.R.array.networkAttributes`的值。 - **启动模块**: 启动配置中的所有网络模块,通常包括`ConnectivityManager.TYPE_WIFI`(WiFi模块)、`ConnectivityManager.TYPE_MOBILE`(移动网络模块)和`ConnectivityManager.TYPE_WIMAX`(WiMAX无线城域网模块)。 - **具体步骤**: 在WiFi模块启动部分创建了`WifiStateTracker`和`WifiService`对象。`WifiService`通过`ServiceManager.addService()`方法注册到系统进程中,并调用`startWifi()`方法开始启动WiFi,同时调用`startMonitoring()`方法监控WiFi状态。 ##### 4. **创建WiFi状态跟踪器** - **创建实例**: 启动WiFi模块时,首先创建了`WifiStateTracker`实例。该类位于`/framework/base/wifi`目录下,继承自`/framework/base/core`目录下的`net`包中的`NetworkStateTracker.java`。本质上是一个处理消息的`Handler`。 - **相关对象**: 在创建`WifiStateTracker`实例的过程中,还创建了`WifiMonitor`跟踪器对象、`NotificationEnabledSettingObserver`用于监听可用WiFi网络的通知,以及`SettingsObserver`用于监听WiFi静态IP、网关等设置的变化。 ##### 5. **创建WifiService对象,启动WiFi服务** - **创建服务对象**: `WifiService`对象创建成功后,调用`startWifi()`方法来启动WiFi。 - **设置WiFi状态**: `startWifi()`方法中根据系统设置的WiFi状态来确定是否启动WiFi。如果WiFi默认开启,则会调用`setWifiEnabled(true)`方法打开WiFi。 ##### 6. **启动WifiStateTracker的WiFi监听器** - **启动监听器**: 在WiFi服务启动后,会调用`WifiStateTracker.startMonitoring()`方法对WiFi状态进行监控。实际上这个方法只是获取了`WifiManager`的实例,为后续操作WiFi提供了途径。 #### 二、WiFi模块在Settings中的设置 - **位置**: 打开WiFi的操作设置位于Settings的“无线和网络”设置下,对应的是`WirelessSettings`对象。 - **相关功能**: 与WiFi相关的功能包括打开/关闭WiFi、配置WiFi、搜索WiFi网络和添加接入点(AP)等操作。这些操作的实现依赖于之前启动的`WifiService`提供的服务。 - **流程**: 在Settings中打开WiFi的具体流程如下: - 用户在Settings中选择打开WiFi。 - 触发事件传递给`WifiManager`。 - `WifiManager`调用`setWifiEnabled(true)`方法。 - 最终调用到`WifiService`中的相应方法,从而真正打开WiFi。 ### 总结 通过对2.3系统的WiFi服务启动、打开WiFi以及扫描WiFi的流程分析,我们可以清晰地了解到WiFi模块是如何被集成到Android系统框架服务中的,并且了解到在系统启动过程中WiFi服务是如何被逐步初始化和配置的。此外,我们还了解到了用户如何通过Settings来控制WiFi的开关状态,以及这些操作背后的具体实现机制。
- yazhouren2012-09-07不错,总结的很好,多谢分享
- 粉丝: 29
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于C++和C混合模式的操作系统开发项目.zip
- (源码)基于Arduino的全球天气监控系统.zip
- OpenCVForUnity2.6.0.unitypackage
- (源码)基于SimPy和贝叶斯优化的流程仿真系统.zip
- (源码)基于Java Web的个人信息管理系统.zip
- (源码)基于C++和OTL4的PostgreSQL数据库连接系统.zip
- (源码)基于ESP32和AWS IoT Core的室内温湿度监测系统.zip
- (源码)基于Arduino的I2C协议交通灯模拟系统.zip
- coco.names 文件
- (源码)基于Spring Boot和Vue的房屋租赁管理系统.zip