packages/apps/settings/src/com/android/settings/wifi/WifiEnabler.java
解析这份源码前,先说一下状态模式
状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
状态模式的使用场景:
-
一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为
-
代码中包含大量与对象状态有关的条件语句,例如,一个操作中包含于庞大的多分支语句(if-else或switch-case),且这些分支依赖于该对象的状态
我们知道WifiSettings类继承至RestrictedSettingsFragment,这个Fragment作用主要是构建一个设置界面、Wi-Fi开关切换按钮、一个Wi-Fi热点显示列表,当Wi-Fi启动后,开始扫描周边Wi-Fi,并且将扫描到的Wi-FI显示到ListView中。在这里有一个重要的类WifiEnabler,就是一个Wi-Fi开关的控制类,它在WifiSettings的onStart()函数中创建,它的创建函数如下:
private WifiEnabler createWifiEnabler() {
final SettingsActivity activity = (SettingsActivity) getActivity();
return new WifiEnabler(activity, new SwitchBarController(activity.getSwitchBar()),
mMetricsFeatureProvider);
}
这个SwitchBar就是Wi-Fi开关的控制按钮。
WifiEnable类创建了一个广播来监听Wi-Fi状态的改变。当Wi-Fi状态需要改变时首先会被广播接收器mReceiver接收到,此时会通过 handleWifiStateChanged(state) 函数修改Wi-Fi开关按钮状态。
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
handleWifiStateChanged(mWifiManager.getWifiState());
} else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
if (!mConnected.get()) {
handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState)
intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
}
} else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
WifiManager.EXTRA_NETWORK_INFO);
mConnected.set(info.isConnected());
handleStateChanged(info.getDetailedState());
}
}
};
private void handleWifiStateChanged(int state) {
// Clear any previous state
mSwitchWidget.setDisabledByAdmin(null);
switch (state) {
case WifiManager.WIFI_STATE_ENABLING:
break;
case WifiManager.WIFI_STATE_ENABLED:
setSwitchBarChecked(true);
mSwitchWidget.setEnabled(true);
break;
case WifiManager.WIFI_STATE_DISABLING:
break;
case WifiManager.WIFI_STATE_DISABLED:
setSwitchBarChecked(false);
mSwitchWidget.setEnabled(true);
break;
default:
setSwitchBarChecked(false);
mSwitchWidget.setEnabled(true);
}
}
WifiEnabler实现SwitchWidgetController.OnSwitchChangeListener 接口,这个接口会监听Wi-Fi开关按钮的状态修改(具体见其对onSwitchToggled方法的实现)。
读这份源码前,要先对接口有一定理解。
本文详细解析了Android系统中WifiEnabler类的工作原理,包括其如何通过状态模式响应Wi-Fi状态变化,以及如何控制Wi-Fi开关按钮的状态。探讨了SwitchBarController、mMetricsFeatureProvider等关键组件的作用。
1609

被折叠的 条评论
为什么被折叠?



