在SystemServer.java中,在 SystemServer 启动的时候,会生成WifiService和ConnectivityService的实例
try {
Slog.i(TAG, "Wi-Fi Service");
if (FeatureConfig.INTEL_FEATURE_ARKHAM) {
wifi = new ExtendWifiService(context);
} else {
<span style="color:#FF0000;"> wifi = new WifiService(context);
}
ServiceManager.addService(Context.WIFI_SERVICE, wifi);</span>
} catch (Throwable e) {
reportWtf("starting Wi-Fi Service", e);
}
…………………………………………………………………………
try {
Slog.i(TAG, "Connectivity Service");
<span style="color:#FF0000;">connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);</span>
networkStats.bindConnectivityManager(connectivity);
networkPolicy.bindConnectivityManager(connectivity);
wifiP2p.connectivityServiceReady();
wifi.checkAndStartWifi();
} catch (Throwable e) {
reportWtf("starting Connectivity Service", e);
}
在ConnectivityService.java中构造函数ConnectivityService中创建DefaultNetworkFactory对象
public ConnectivityService(Context context, INetworkManagementService netManager,
INetworkStatsService statsService, INetworkPolicyManager policyManager,
NetworkFactory netFactory) {
if (DBG) log("ConnectivityService starting up");
HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");
handlerThread.start();
mHandler = new InternalHandler(handlerThread.getLooper());
mTrackerHandler = new NetworkStateTrackerHandler(handlerThread.getLooper());
if (netFactory == null) {
<span style="color:#FF0000;">netFactory = new DefaultNetworkFactory(context, mTrackerHandler);</span>
}
。。。。。。。。
}
在DefaultNetworkFactory.java中创建类WifiStateTracker对象
private static class DefaultNetworkFactory implements NetworkFactory {
private final Context mContext;
private final Handler mTrackerHandler;
public DefaultNetworkFactory(Context context, Handler trackerHandler) {
mContext = context;
mTrackerHandler = trackerHandler;
}
@Override
public NetworkStateTracker <span style="color:#FF0000;">createTracker</span>(int targetNetworkType, NetworkConfig config) {
switch (config.radio) {
case TYPE_WIFI:
<span style="color:#FF0000;"> return new WifiStateTracker(targetNetworkType, config.name);</span>
case TYPE_MOBILE:
return new MobileDataStateTracker(targetNetworkType, config.name);
case TYPE_DUMMY:
return new DummyDataStateTracker(targetNetworkType, config.name);
case TYPE_BLUETOOTH:
return BluetoothTetheringDataTracker.getInstance();
case TYPE_WIMAX:
return makeWimaxStateTracker(mContext, mTrackerHandler);
case TYPE_ETHERNET:
return (NetworkStateTracker) mContext.getSystemService(Context.ETHERNET_SERVICE);
default:
throw new IllegalArgumentException(
"Trying to create a NetworkStateTracker for an unknown radio type: "
+ config.radio);
}
}
}
ConnectivityService 的构造函数会创建 mWifiStateTracker,而 WifiStateTracker会创建 WifiMonitor接收来自底层的事件 。
WifiService和 WifiMonitor是整个模块的核心。WifiService负责启动关闭 wpa_supplicant、启动关闭 WifiMonitor监视线程和把命令下发给 wpa_supplicant,而 WifiMonitor则负责从 wpa_supplicant 接收事件通知。