1. 为什么需要监听WiFi连接状态?
在上一篇文章里,我们搞定了WiFi列表的获取和展示,界面上的WiFi信号点一个个列出来,看着挺像那么回事。但不知道你有没有遇到过这种情况:在手机上打开WiFi设置,明明已经连上了家里的网络,但列表里那个WiFi的信号图标还是灰的,或者状态显示不对,非得手动下拉刷新一下列表,它才“哦”一声反应过来,更新成已连接的状态。这种体验就非常割裂,用户会觉得你的应用“反应迟钝”。
所以,光把列表展示出来是远远不够的。一个真正好用的WiFi管理功能,必须能实时、准确地反映网络连接状态的变化。想象一下这些场景:用户从办公室走到会议室,手机自动切换到了会议室的WiFi;用户手动点击连接了一个新的热点;或者更常见的,WiFi密码输错了,连接失败。这些时刻,你的应用界面都应该立刻、自动地更新,告诉用户“嘿,你现在连上这个了”或者“抱歉,连接失败了,可能是密码不对”。
这就是我们这一篇要解决的核心问题:监听WiFi连接状态的动态变化,并实现列表的实时刷新。在Android 11上,这套机制变得更加清晰和强大,但也有一些新的坑需要注意。我会结合我实际开发中踩过的雷,带你一步步搭建一个健壮的监听体系,让你的应用能像系统设置一样灵敏。
2. 理解Android 11的网络状态监听体系
在动手写代码之前,我们得先搞清楚Android,特别是Android 11,是怎么管理网络状态变化的。如果你还抱着老一套“只注册一个WIFI_STATE_CHANGED_ACTION广播就万事大吉”的想法,那在Android 11上很可能会漏掉很多关键事件。
Android的网络状态信息,可以粗略分为两个层面:WiFi硬件/连接层面和系统网络可用性层面。它们各自有对应的监听机制。
WiFi层面,主要关心的是WiFi开关、扫描结果、具体的连接过程(比如正在验证、正在获取IP地址)、以及连接成功或失败。这些信息主要通过WifiManager发出的各类广播来传递。
系统网络层面,更关心的是设备当前有没有可用的网络(无论是WiFi还是移动数据),这个网络能不能真正访问互联网(比如是否通过了强制门户认证),以及网络的能力属性(比如是否按流量计费)。这个层面的信息,则由ConnectivityManager来管理。
在Android 11上,Google进一步收紧了后台广播的限制,一些隐式广播(比如经典的CONNECTIVITY_ACTION)已经无法在Manifest里静态注册了,必须动态注册。同时,它也推荐我们使用更现代、更精准的NetworkCallback API来替代部分广播监听。所以,一个完整的监听方案,应该是广播接收器(BroadcastReceiver) 和网络回调(NetworkCallback) 的结合体。
下面这个表格帮你快速理清我们主要需要关注哪些事件:
| 监听目标 | 关键Action / Callback | 说明 | 主要用途 |
|---|---|---|---|
| WiFi开关状态 | WifiManager.WIFI_STATE_CHANGED_ACTION |
WiFi硬件开启、关闭、正在开启、正在关闭。 | 更新界面顶部的WiFi开关UI,在WiFi关闭时清空列表。 |
| 扫描结果 | WifiManager.SCAN_RESULTS_AVAILABLE_ACTION |
新的WiFi扫描结果已就绪。 | 触发WiFi列表的刷新,获取最新的周边热点信息。 |
| 连接状态变化 | WifiManager.NETWORK_STATE_CHANGED_ACTION |
WiFi连接状态发生根本变化,如已连接、已断开。 | 核心:更新列表中各WiFi项(特别是当前连接项)的连接状态图标和文字。 |
| 认证过程状态 | WifiManager.SUPPLICANT_STATE_CHANGED_ACTION |
连接过程中的详细状态,如正在认证、认证失败等。 | 处理连接失败的具体原因(如密码错误),给用户更精确的提示。 |
| 已保存网络变化 | WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION |
设备保存的WiFi配置列表发生变化(增、删、改)。 | 刷新列表,反映“已保存”网络的状态变化。 |
| 系统默认网络 | ConnectivityManager.NetworkCallback (如 onAvailable, onLost) |
系统默认的网络连接发生变化(例如从移动数据切换到WiFi)。 | 感知设备整体的网络切换,可用于触发WiFi列表的重新评估。 |
| 网 |


5635

被折叠的 条评论
为什么被折叠?



