Android WIFI开发之广播监听

2019-08-02  本文已影响0人  罗永慧

在 WIFI 网络开发过程中,容易对网络变化的系统广播和不同广播对应的网络状态区分不清楚,所以对常用的系统网络广播Intent Action和网络状态含义做了整理,希望能够加强记忆并且帮助到大家理解何时应该监听哪种系统广播。

一、 WifiManager.WIFI_STATE_CHANGED_ACTION
解释: WIFI 开关(是否可用)状态广播
状态相关类: WifiManager

状态如下:

状态获取代码:

Intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,0):WIFI当前开关状态;
Intent.getIntExtra(WifiManager.EXTRA_PREVIOUS_WIFI_STATE,0):WIFI开关前一个状态;

二、 WifiManager.NETWORK_STATE_CHANGED_ACTION
解释: 网络状态变化广播
状态相关类: NetworkInfo

1)通用状态(State):

2)详细状态(DetailedState):

通用状态和详细状态在源码中有对应关系,源代码如下:

static {
        stateMap.put(DetailedState.IDLE, State.DISCONNECTED);
        stateMap.put(DetailedState.SCANNING, State.DISCONNECTED);
        stateMap.put(DetailedState.CONNECTING, State.CONNECTING);
        stateMap.put(DetailedState.AUTHENTICATING, State.CONNECTING);
        stateMap.put(DetailedState.OBTAINING_IPADDR, State.CONNECTING);
        stateMap.put(DetailedState.VERIFYING_POOR_LINK, State.CONNECTING);
        stateMap.put(DetailedState.CAPTIVE_PORTAL_CHECK, State.CONNECTING);
        stateMap.put(DetailedState.CONNECTED, State.CONNECTED);
        stateMap.put(DetailedState.SUSPENDED, State.SUSPENDED);
        stateMap.put(DetailedState.DISCONNECTING, State.DISCONNECTING);
        stateMap.put(DetailedState.DISCONNECTED, State.DISCONNECTED);
        stateMap.put(DetailedState.FAILED, State.DISCONNECTED);
        stateMap.put(DetailedState.BLOCKED, State.DISCONNECTED);
    }

对应关系图表为:

详细状态名称 通用状态名称
IDLE、SCANNING DISCONNECTED
CONNECTING、AUTHENTICATING、OBTAINING_IPADDR、VERIFYING_POOR_LINK、CAPTIVE_PORTAL_CHECK CONNECTING
CONNECTED CONNECTED
SUSPENDED SUSPENDED
DISCONNECTING DISCONNECTING
DISCONNECTED、FAILED、BLOCKED DISCONNECTED

因此,只有在CONNECTED时网络IP才可用,网络才算是连接完成。

注: DHCP : 动态主机设置协议,是局域网的网络协议,用于内部网和网络服务商自动分配IP地址。
状态获取代码:

intent.getParcelableExtra<Parcelable>(WifiManager.EXTRA_NETWORK_INFO): 获取NetworkInfo#State状态

三、 WifiManager.SUPPLICANT_STATE_CHANGED_ACTION
解释: 建立与Access Point的连接状态变化广播
状态标注类: SupplicantState

状态如下:

注: AP代表Access Point,网络热点;WPA、WPA-EAP、IEEE 802.1x等名词请查看博客 Android WiFi 之 认证标准、密钥管理、加密方案

状态获取代码:

intent.getParcelableExtra<Parcelable>(WifiManager.EXTRA_NEW_STATE) : 获取SupplicantState状态

SupplicantState和NetworkInfo#DetailedState同样存在对应关系,源代码如下:

 static {
        stateMap.put(SupplicantState.DISCONNECTED, DetailedState.DISCONNECTED);
        stateMap.put(SupplicantState.INTERFACE_DISABLED, DetailedState.DISCONNECTED);
        stateMap.put(SupplicantState.INACTIVE, DetailedState.IDLE);
        stateMap.put(SupplicantState.SCANNING, DetailedState.SCANNING);
        stateMap.put(SupplicantState.AUTHENTICATING, DetailedState.CONNECTING);
        stateMap.put(SupplicantState.ASSOCIATING, DetailedState.CONNECTING);
        stateMap.put(SupplicantState.ASSOCIATED, DetailedState.CONNECTING);
        stateMap.put(SupplicantState.FOUR_WAY_HANDSHAKE, DetailedState.AUTHENTICATING);
        stateMap.put(SupplicantState.GROUP_HANDSHAKE, DetailedState.AUTHENTICATING);
        stateMap.put(SupplicantState.COMPLETED, DetailedState.OBTAINING_IPADDR);
        stateMap.put(SupplicantState.DORMANT, DetailedState.DISCONNECTED);
        stateMap.put(SupplicantState.UNINITIALIZED, DetailedState.IDLE);
        stateMap.put(SupplicantState.INVALID, DetailedState.FAILED);
    }

对应关系图表如下:

SupplicantState状态 NetworkInfo#DetailedState状态
DISCONNECTED、INTERFACE_DISABLED、DORMANT DISCONNECTED
INACTIVE、UNINITIALIZED IDLE
SCANNING SCANNING
AUTHENTICATING、ASSOCIATING、ASSOCIATED CONNECTING
FOUR_WAY_HANDSHAKE、GROUP_HANDSHAKE AUTHENTICATING
COMPLETED OBTAINING_IPADDR
INVALID FAILED

由此可以看出,SupplicantState状态更多的是NetworkInfo#DetailedState的过程状态,对整个网络连接做了更详细的划分,但是没有任何状态表面Access Point已经可用。

通过SupplicantState获取NetworkInfo#DetailedState,调用系统API WifiInfo.getDetailedStateOf(SupplicantState suppState)即可。

上一篇 下一篇

猜你喜欢

热点阅读