我开发了一个使用 Wifi 广播接收器的应用程序。我的要求是当 Wifi 连接到路由器时通过获取 IP 地址来调用函数,以及当 Wifi 与先前连接的路由器断开连接时调用另一个函数。
我在 list 中使用了这个
<action android:name="android.net.wifi.STATE_CHANGE" />
用于注册广播接收器。
以及OnReceive
中的广播接收器类:
NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
NetworkInfo.State state = networkInfo.getState();
if (state == NetworkInfo.State.CONNECTED) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wi = wifiManager.getConnectionInfo();
Log.e("++++WiFi Conected","++++WiFi Conected");
Flags.wifiState = true;
updateWifiSyncTrue(context);
if (wi.getIpAddress() != 0) {
intent = new Intent(context, ConnectionService.class);
intent.putExtra("intentValue", "signalOn");
intent.putExtra("bssId", wi.getBSSID());
context.startService(intent);
}
}
if (state == NetworkInfo.State.DISCONNECTED) {
Log.e("++++WiFi DisConected","++++WiFi DisConnected");
Flags.wifiState = false;
updateWifiSyncFalse(context);
updateRouterSyncFalse(context);
intent = new Intent(context, ConnectionService.class);
intent.putExtra("intentValue", "signalOff");
context.startService(intent);
}
一切顺利,直到 KitKat 但是当我用 Lollipop 版本的 On Receive 测试这个时,调用了很多次。
当我打开 WiFi 时,其结果为 状态 : 空闲--连接--身份验证--强制检查--已连接--已连接。 有时也会断开连接。
关闭时。 已连接 -- 已断开连接 -- 已断开连接 -- 已断开连接 -- 已断开
NetworkInfo
的调试结果如下:
[type: WIFI[], state: CONNECTING/CONNECTING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTING/AUTHENTICATING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTING/AUTHENTICATING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTING/CONNECTING, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTING/OBTAINING_IPADDR, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTING/CAPTIVE_PORTAL_CHECK, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTING/CAPTIVE_PORTAL_CHECK, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false]
[type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: "DJ Hostspot", roaming: false, failover: false, isAvailable: true, isConnectedToProvisioningNetwork: false].
我恳请您帮助我。当 wifi 打开时使用我的代码 CONNECTED
状态会执行多次,DISCONNECTED
状态也会执行。
当WIFI关闭时,会生成Connected状态,然后生成4-5Disconnected状态。
我使用HTC手机进行测试。
我使用了简单的编码,我是否需要对此进行更深入的条件检查? (详细状态等...)
处理此解决方案的最佳方法是什么?
最佳答案
当您使用 Intent 过滤器android.net.wifi.STATE_CHANGE
时,它会多次触发广播接收器。例如,如果您打开 wifi,则广播的 onreceive
将多次调用,次数从 1 到 5 次不等。因此,它会给你多个 NetworkInfo.State.CONNECTED ,并且断开连接也是如此。
因此,如果您只想连接一个或断开连接,则其输出意味着只需使用 boolean 标志并以某种方式正确设置它,首先,如果启用了 wifi,则意味着它应该忽略剩余的 wifi 连接 Intent ,并且类似地,wifi 也断开连接。
关于java - wifi广播接收器多个 Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40360665/