Android 9.0 飛行模式下WiFi狀態變化

在Android 9.0 中,AirPlaneMode與WiFi的原生設定是這樣的:

1、開啓飛行模式時,如果wifi打開,則關閉,如果是關閉狀態則不處理。
2、開啓飛行模式只會關閉WiFi,不會禁用,用戶還可在飛行模式下再次手動打開WiFi.
3、關閉飛行模式時,WiFi會恢復成開啓飛行模式之前的狀態,即開啓飛行模式時WiFi是開的,則關閉飛行模式後會再次打開WiFi。

代碼實現:WiFi與飛行模式的處理主要在WifiSettingsStore中處理。
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiSettingsStore.java

WifiSettingsStore 中主要設置了四個變量來表示WiFi的所有狀態:

1、WIFI_DISABLED     飛行模式關閉情況下WiFi是關閉狀態
2、WIFI_ENABLED      飛行模式關閉情況下WiFi是開啓狀態
3、WIFI_ENABLED_AIRPLANE_OVERRIDE    在飛行模式狀態下手動開啓WiFi
4、WIFI_DISABLED_AIRPLANE_ON   因爲打開飛行模式導致WiFi被關閉

mPersistWifiState 來表示當前 WiFi 狀態

static final int WIFI_DISABLED                      = 0;
static final int WIFI_ENABLED                       = 1;

/* Wifi enabled while in airplane mode */
private static final int WIFI_ENABLED_AIRPLANE_OVERRIDE     = 2;
/* Wifi disabled due to airplane mode on */
private static final int WIFI_DISABLED_AIRPLANE_ON          = 3;

/* Persisted state that tracks the wifi & airplane interaction from settings */
private int mPersistWifiState = WIFI_DISABLED;

這裏是關鍵函數。判斷 WiFi 現在的狀態。
當 mAirplaneModeOn 爲 true 時,如果函數返回 ture ,則說明WiFi 是在飛行模式開啓的。
當 mAirplaneModeOn 爲 false 時,如果函數返回 ture ,則說明WiFi是因爲打開飛行模式被關閉的。

public synchronized boolean isWifiToggleEnabled() {
    if (!mCheckSavedStateAtBoot) {
        mCheckSavedStateAtBoot = true;
        if (testAndClearWifiSavedState()) return true;
    }

    if (mAirplaneModeOn) {
        return mPersistWifiState == WIFI_ENABLED_AIRPLANE_OVERRIDE;
    } else {
        return mPersistWifiState != WIFI_DISABLED;
    }
}

在 WifiController 中會監聽飛行模式,如果飛行模式關閉且判斷WiFi是因爲飛行模式而關閉,就會進入DeviceActiveState狀態。而DeviceActiveState是StaEnabledState的子狀態,即打開WiFi。
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java

class DefaultState extends State {
    @Override
    public boolean processMessage(Message msg) {
        switch (msg.what) {
            case CMD_AIRPLANE_TOGGLED:
                if (mSettingsStore.isAirplaneModeOn()) {
                    log("Airplane mode toggled, shutdown all modes");
                    mWifiStateMachinePrime.shutdownWifi();
                    transitionTo(mStaDisabledState);
                } else {
                    log("Airplane mode disabled, determine next state");
                    if (mSettingsStore.isWifiToggleEnabled()) {
                        transitionTo(mDeviceActiveState);
                    } else if (checkScanOnlyModeAvailable()) {
                        transitionTo(mStaDisabledWithScanState);
                    }
                    // wifi should remain disabled, do not need to transition
                }
                break;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章