Android WIFI开发之广播监听

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

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

状态如下:

  • WIFI_STATE_DISABLED: WIFI功能已经被关闭
  • WIFI_STATE_DISABLING: WIFI功能关闭中,处于此状态WIFI不可以用
  • WIFI_STATE_ENABLED: WIFI功能已经被打开
  • WIFI_STATE_ENABLING: WIFI功能正在打开中,处于此状态WIFI可用
  • WIFI_STATE_UNKNOWN: WIFI功能状态不可知

状态获取代码:

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):

  • CONNECTING: 正在连接网络;
  • CONNECTED: 网络连接成功;
  • SUSPENDED: 网络暂停;
  • DISCONNECTING: 正在断开连接;
  • DISCONNECTED: 连接已断开;
  • UNKNOWN: 未知状态;

2)详细状态(DetailedState):

  • IDLE: 准备开始数据连接设置;
  • SCANNING:正在搜索可用网络;
  • CONNECTING: 正在建立数据连接;
  • AUTHENTICATING: 网络连接建立,执行身份认证;
  • OBTAINING_IPADDR: 等待DHCP服务器的相应以分配IP地址信息;
  • CONNECTED: 此时IP流量应该是可用的;
  • SUSPENDED: IP流量暂停
  • DISCONNECTING: 当前正在断开数据连接;
  • DISCONNECTED: 网络连接已断开,IP流量不可用;
  • FAILED:尝试连接失败;
  • BLOCKED: 禁止访问此网络;
  • VERIFYING_POOR_LINK: 链接连接不良;
  • CAPTIVE_PORTAL_CHECK: 检查网络是否是强制网络门户;

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

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

状态如下:

  • DISCONNECTED: 客户端未连接AP,但是正在搜索一个AP,如连接丢失时触发;
  • INTERFACE_DISABLED: 禁用网络接口时进入此状态,wpa_supplication拒绝任何使用无线的操作;
  • INACTIVE: WIFI配置中没有启用的网络时进入此状态,同时没有和任何网络尝试连接,需要外部交互来建立连接;
  • SCANNING: 正在扫描网络;
  • AUTHENTICATING: 发现合适网络,尝试与此网络进行认证时进入此状态,与网络驱动相关;
  • ASSOCIATING: 尝试与SSID对应的AP进行关联,与网络驱动相关;
  • ASSOCIATED: 当网络驱动已经返回与AP的关联成功时进入此状态,如果使用的是IEEE 802.1X模式,会等到起身份认证成功后进入此状态;
  • FOUR_WAY_HANDSHAKE: 当WPA/WPA2 四次握手启动时进入此状态,如果是WPA-PSK情况下,关联成功后接收到第一个EAPOL-Key帧时会直接进入此状态。在WPA-EAP的情况下,会完成认证后进入;
  • GROUP_HANDSHAKE:四次握手完成,当请求者开始接收消失时,进入此状态;
  • COMPLETED:所有认证已经完成进入状态,此时可能没有分配任何IP,需要发送DHCP请求来获取地址;
  • DORMANT:用户明确发出中断指令时进入状态;
  • UNINITIALIZED: 没有连接wpa_supplicant,是一个伪状态;
  • INVALID: 伪状态,一般不会出现;

注: 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)即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容