接着上一篇,这篇说一下Wifi的关闭流程。
由上一篇可以知道,framework层提供的wifi开关接口都是setWifiEnabled,只是参数不同而已。true表示开启wifi、false表示关闭wifi。
Wifi开关在WifiManager和WifiService中的流程一样,接着看WifiController。
wifi开启的时候,WifiController中状态为DeviceActiveState(其父状态为StaEnabledState)。
一下是StaEnabledState对CMD_WIFI_TOGGLED消息的处理。
case CMD_WIFI_TOGGLED:
if (! mSettingsStore.isWifiToggleEnabled()) {
if (mSettingsStore.isScanAlwaysAvailable()) {
transitionTo(mStaDisabledWithScanState);
} else {
transitionTo(mApStaDisabledState);
}
}
break;
isWifiToggleEnabled为false表示要关闭wifi,则将状态切换到StaDisabledWithScanState(如果可以一直扫描)或ApStaDisabledState。
我们这里主要看下切换到ApStaDisabledState状态。切换到ApStaDisabledState状态,会先走其enter函数。
class ApStaDisabledState extends State {
private int mDeferredEnableSerialNumber = 0;
private boolean mHaveDeferredEnable = false;
private long mDisabledTimestamp;
@Override
public void enter() {
mWifiStateMachine.setSupplicantRunning(false);
// wpa_supplicant 不能立即重启,所以记录下关闭的时间。
mDisabledTimestamp = SystemClock.elapsedRealtime();
mDeferredEnableSerialNumber++