WifiEnabler.java源码解析

本文详细解析了Android系统中WifiEnabler类的工作原理,包括其如何通过状态模式响应Wi-Fi状态变化,以及如何控制Wi-Fi开关按钮的状态。探讨了SwitchBarController、mMetricsFeatureProvider等关键组件的作用。
packages/apps/settings/src/com/android/settings/wifi/WifiEnabler.java

解析这份源码前,先说一下状态模式

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

状态模式的使用场景

  1. 一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为

  2. 代码中包含大量与对象状态有关的条件语句,例如,一个操作中包含于庞大的多分支语句(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方法的实现)。

读这份源码前,要先对接口有一定理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值