在 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(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(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)即可。

android wifi 广播吗,Android WIFI开发之广播监听相关推荐

  1. android列表项点击事件,Android 开发 tips(2):监听 Listview 列表项点击事件

    Android 开发 tips(2):监听 Listview 列表项点击事件 (这篇和上篇本来是应该一起写的,但是太过冗长,附链接:[SimpleAdapter 在 Listview 中的应用] ht ...

  2. android全局监听onkeydown,Android中的几个onTouch()事件、onKeyDown监听返回键无效

    Android中的几个onTouch()事件.onKeyDown监听返回键无效 一:Android中的几个onTouch()事件 继承SimpleOnGestureListener,HahaGestu ...

  3. iOS开发之网络监听(一)Reachability

    demo下载 Reachability对系统的网络状况类SCNetworkReachability进行的封装,持有全局的网络状况句柄reachabilityRef,简化了SCNetworkReacha ...

  4. Wear OS手表应用开发教程之-监听手表按键以及获取按键信息-WearableButtons

    本文目录 点击直达 Wear OS手表应用开发系列教程 点击直达 本文标签 `路过的年轻人啊,你是要用左手点个赞呢,还是要右手点个关注呢` 前言: 获取按键信息: 获取按键数量 获取按键信息 获取按键 ...

  5. Android开发动态的监听网络状态的变化

    主要思路:使用Android中的四大组件之:BrocastReceiver监听网络状态的变化.接收到网络状态改变的广播之后判断当前的网络是否可用. 创建广播接收器MyNetworkReceiver p ...

  6. Android 屏幕灭屏亮屏广播,屏幕灭屏亮屏监听,广播实现按键监听

    service 类注册广播进行监听 /*** 作者:created by meixi* 邮箱:13164716840@163.com* 日期:2018/9/27 09*/ public class S ...

  7. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(监听Wi-Fi和APP的数据)

    1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(来看一下怎么样监听网络数据,监听电脑上位机软件的数据) 因为那个软件只能监听咱自己电脑上的数据,所以咱就用电 ...

  8. 《Android开发卷——实时监听文本框输入》

       在实际开发中,有时候会让用户发布一些类似微博.说说的东西,但是这个是有限制长度的,除了在文本输入框限制长度外,还要在旁边有一条提示还能输入多少个字的"友好提示". 1.文本框 ...

  9. android u盘挂载监听,Android SD卡及U盘插拔状态监听及内容读取

    本篇是通过系统方法来对sd卡及U盘插拔监听及数据获取,Android盒子端开发,有系统权限,当然,这个比较简单,知道具体方法,可以通过反射来实现. 先贴上效果图: 获取外置存储设备并监听插拔状态 获取 ...

  10. Android SD卡及U盘插拔状态监听和内容读取

    本篇是通过系统方法来对sd卡及U盘插拔监听及数据获取,Android盒子端开发,有系统权限,当然,这个比较简单,知道具体方法,可以通过反射来实现. 先贴上效果图: 获取外置存储设备并监听插拔状态 获取 ...

最新文章

  1. 在ubuntu系统中使用dpkg命令安装后缀名为deb的软件包
  2. 牛客网 牛客练习赛13 A.幸运数字Ⅰ
  3. LeetCode面试刷题技巧-二分查找算法(下):通过 LeetCode 学习二分查找算法-销售价值减少的颜色球
  4. OpenGL 泛光Bloom
  5. python 公司年会抽奖_用Python做个年会抽奖小程序吧
  6. 向上类型转换VS向下类型转换
  7. 阿里云 ESSD 采用自研新一代存储网络协议,打造“超级高速”
  8. html3d转换,CSS3 3D 转换
  9. html页脚显示不出来,CSS实例:让页脚保持在未满屏页面的底部
  10. 张量分析:运算关系式参考
  11. python 安装 pyHook
  12. IllustratorCS6-桌面排版与插画绘制-01-使用散点画笔绘制璀璨星云
  13. 机器学习 深度学习 EM算法 深度解析
  14. conventional-changelog 参数含义
  15. win10系统修改电脑 hosts 地址
  16. WIN中SCHTASKS用法(定时执行程序)
  17. SQL如何实现Excel自动分列功能?
  18. 陪读21:《像利弗莫尔一样交易·买在关键点》——板块时机
  19. 互动媒体——随及行为以及运动学
  20. 【Docker】镜像制作及使用Dockerfile制作镜像

热门文章

  1. C程序常见符号分类,看完你就懂了......
  2. Python3_01(Linux基础)
  3. 使用UDP协议构建简易局域网内聊天室
  4. 微信聊天机器人-wechaty
  5. Eclipse的SVN插件 Subclipse
  6. 《货币战争2-金权天下》杂录。。这本书读了之后我觉得有点对努力和奋斗失去信心,所以。
  7. php判断命令行执行,PHP 判断脚本执行是不是在命令行
  8. 使用 journalctl 查看日志
  9. charles V4.2.1最新版本破解方法
  10. Koa的洋葱模型到底是什么?