java - wifi广播接收器多个 Intent

标签 java android broadcastreceiver android-broadcastreceiver wifimanager

我开发了一个使用 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/

相关文章:

android - 在 sqlite 数据库更改时自动刷新 ListView - Android 聊天应用程序

java - 应用程序上下文是否总是需要在服务器上加载 war 文件

java - 在 Firestore 中合并查询

android - PrintWriter 是否有某种内部缓冲区?

android - Boot 上的 Launch Activity 已完成,Mount 上的另一个 Activity 已完成

android - 如何检测 Android 应用程序启动?

Java:向方法发送多个参数

java - let 在 Java 世界中意味着什么?

xml - Android Edittext问题,用done替换keypad enter

android - 找不到 ndk-build.cmd 命令