这几天闲着没事,我就随便拿起Android源码看看。以下要讲的是在ICS中wifi初始化的一些流程。
涉及的文件有:
SystemServer.java
WifiSettings.java
WifiEnabler.java
WifiManager.java
WifiService.java
WifiStateMachine.java
android_net_wifi_wifi.cpp
wifi.c
首先从SystemServer.java开始,它做了3个动作:
1.添加注册ConnectivityService连接服务,它跟所有手机的无线通信都有联系,包括wifi,蓝牙,2g网络,3g网络等
connectivity = new ConnectivityService(
context, networkManagement, networkStats, networkPolicy);
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
2.管理开机wifi开启与否的问题
wifi.checkAndStartWifi();
public void checkAndStartWifi() {
mAirplaneModeOn.set(isAirplaneModeOn());
mPersistWifiState.set(getPersistedWifiState());
boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
setWifiEnabled(wifiEnabled);
mWifiWatchdogStateMachine = WifiWatchdogStateMachine.
makeWifiWatchdogStateMachine(mContext);
}
3.添加注册wifi的核心服务wifiservice
wifi = new WifiService(context);
ServiceManager.addService(Context.WIFI_SERVICE, wifi);
好了,机器启动的时候动作就这些。要开启wifi,还需要人在设置界面进行开启。·
下面将一步步介绍wifi是怎样开启起来的
进入wifi设置界面,相关文件WifiSettings.java
开启Wifi的组件是一个CompoundButton,跟它关联起来的是一个WifiEnabler.java类,它是在WifiSettings里面初始化的
public void onActivityCreated(Bundle savedInstanceState) {
mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);
}
当用户点击wifi的开启按钮时候,会触发WifiEnabler里面的onCheckedChanged函数
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (mWifiManager.setWifiEnabled(isChecked)) {
mSwitch.setEnabled(false);
} else {
Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();
}
在onCheckedChanged函数里面,调用了WifiManager的setWifiEnabled方法
public boolean setWifiEnabled(boolean enabled) {
try {
return mService.setWifiEnabled(enabled);
} catch (RemoteException e) {
return false;
}
}
它返回的是mService.setWifiEnabled(enabled),这里的mService是WifiService的代理,所以它实际调用的是wifiService里面的setWifiEnabled函数
public class WifiService extends IWifiManager.Stub ,我们可以看到WifiService继承一个接口IWifiManager.Stub,凡是继承了像这种形式写法的接口服务,都可以进行远程调用,这就是Android内部的aidl通信。接下来进入wifiservice
public synchronized boolean setWifiEnabled(boolean enable) {
mWifiStateMachine.setWifiEnabled(enable);
}
可以看到,又进入WifiStateMachine的setWifiEnabled方法,mWifiStateMachine是在Wifiservice的构造函数完成初始化 的
WifiService(Context context) {
mWifiStateMachine = new WifiStateMachine(mContext, mInterfaceName);
}
先介绍一下WifiStateMachine这个类,光看名字就知道wifi状态机,它里面记录了wifi的各种状态,driverUnloadedstate、mDriverUnloadingState、mDriverLoadingState、mDriverLoadedState、mSupplicantStartingState,每种状态都有enter()、exit()、processMessage()3个函数,分别处理进入该状态,退出该状态的动作,以及消息处理。在WifiStateMachine构造函数里面,它把所有状态都添加进状态机去,形成一个状态树,并在结尾出启动这个状态机工作。
public WifiStateMachine(Context context, String wlanInterface) {
addState(mDefaultState);
addState(mInitialState, mDefaultState);
addState(mDriverUnloadingState, mDefaultState);
addState(mDriverUnloadedState, mDefaultState);
addState(mDriverFailedState, mDriverUnloadedState);
addState(mDriverLoadingState, mDefaultState);