Android 接收网络\u状态\u更改\u更改网络时已连接的操作

Android 接收网络\u状态\u更改\u更改网络时已连接的操作,android,networking,broadcastreceiver,wifi,broadcast,Android,Networking,Broadcastreceiver,Wifi,Broadcast,问题: public class MainActivity extends AppCompatActivity { private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { NetworkInfo info = intent.getP

问题:

public class MainActivity extends AppCompatActivity {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            Log.i("Wi-Fi network state", info.getDetailedState().toString());
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(receiver);
        super.onDestroy();
    }
}
我正在开发一个Android应用程序,需要在不同的Wi-Fi网络之间切换。当用户决定连接到另一个网络时,我的应用程序必须等到连接完成,所以我需要知道何时会发生这种情况

为了实现这一点,我注册了一个BroadcastReceiver,它只接收网络状态改变的动作。当接收到广播时,我会额外获取NetworkInfo并检查它是否已连接

我在一台安卓5.0设备上进行了测试,效果良好。然而,当我在另一台设备上测试Android 5.1时,该应用程序并没有等到连接完成。这是因为在我切换到另一个网络后立即接收到广播,NetworkInfo对象指示网络已连接

为什么会这样

最小工作示例:

public class MainActivity extends AppCompatActivity {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
            Log.i("Wi-Fi network state", info.getDetailedState().toString());
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        unregisterReceiver(receiver);
        super.onDestroy();
    }
}
在运行这个程序时,我手动切换到另一个网络。以下是此后打印在日志中的网络状态更改操作事件:

02-03 17:25:23.786 I/Wi-Fi network state: CONNECTED       <-- Why? I'm disconnecting :(
02-03 17:25:23.794 I/Wi-Fi network state: DISCONNECTED
02-03 17:25:23.800 I/Wi-Fi network state: DISCONNECTED
02-03 17:25:23.898 I/Wi-Fi network state: DISCONNECTED
02-03 17:25:23.941 I/Wi-Fi network state: DISCONNECTED
02-03 17:25:23.944 I/Wi-Fi network state: CONNECTING
02-03 17:25:23.955 I/Wi-Fi network state: CONNECTING
02-03 17:25:26.205 I/Wi-Fi network state: AUTHENTICATING
02-03 17:25:26.210 I/Wi-Fi network state: OBTAINING_IPADDR
02-03 17:25:26.214 I/Wi-Fi network state: OBTAINING_IPADDR
02-03 17:25:26.219 I/Wi-Fi network state: CONNECTING
02-03 17:25:26.221 I/Wi-Fi network state: OBTAINING_IPADDR
02-03 17:25:28.292 I/Wi-Fi network state: CAPTIVE_PORTAL_CHECK
02-03 17:25:28.297 I/Wi-Fi network state: CAPTIVE_PORTAL_CHECK
02-03 17:25:28.304 I/Wi-Fi network state: CONNECTED
02-03 17:25:28.312 I/Wi-Fi network state: CONNECTED
02-03 17:30:32.400 I/Wi-Fi network state: CONNECTED

尽管如此,问题依然存在。当我实际上正在断开连接时,为什么我的应用程序会收到指示网络已连接的广播?

请尝试编写一个外部类,从当前上下文检查连接,而不是从
意图检查连接

/*
 * True if network available else FALSE
 */
public static boolean isNetwork(Context mContext) {
    ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null && activeNetwork.isConnected();
}

从您的
BroadcastReceiver
尝试调用上述方法来确定
互联网的可用性

我正在测试您的解决方案,似乎很有希望。但是,ConnectivityManager中的方法
getAllNetworkInfo()
已被弃用。我使用了您发布的类,但对
的所有调用均返回false。我尝试了一些变体,避免了不推荐的方法,但没有成功。无论如何,谢谢你的帮助@米拉克:我更改了密码,请检查编辑后的答案。奇怪。在第一次广播中,连接了
activeNetwork
info对象。但是在上一次广播中,当新连接假定完成时,
activeNetwork
为空,因此函数
isNetwork(context)
返回false。