Android 如何检测网络中的变化?

Android 如何检测网络中的变化?,android,networking,Android,Networking,我需要知道如何在Wi-Fi网络中检测交换机,尽管是自动或手动的,但这并不重要。当检测到交换机时,是否在整个系统中广播某种意图?或者我必须通过调用ConnectionManager上的方法手动检查是否选择了一个新网络?此时,我已经这样解决了这个问题(由于目前没有第二个可用网络,所以尚未对其进行全面测试): 我扩展了BroadcastReceiver类 private class NetworkSwitcher extends BroadcastReceiver { @Override

我需要知道如何在Wi-Fi网络中检测交换机,尽管是自动或手动的,但这并不重要。当检测到交换机时,是否在整个系统中广播某种意图?或者我必须通过调用ConnectionManager上的方法手动检查是否选择了一个新网络?

此时,我已经这样解决了这个问题(由于目前没有第二个可用网络,所以尚未对其进行全面测试):

我扩展了BroadcastReceiver类

private class NetworkSwitcher extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            return;
        }
        NetworkInfo networkInfo =
            (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        if (networkInfo.isConnected()) {
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                Log.d(TAG, "Network type: " + networkInfo.getTypeName() +
                        " Network subtype: " + networkInfo.getSubtypeName());
                getOwnIpAddress();
                mClient.updateUnicastSocket(mOwnAddress, mUnicastPort);
            }
        } 
        else {
            Log.e(TAG, "Network connection lost");
        }
    }
}
我将该类注册为接收器,并将筛选器设置为
ConnectivityManager.CONNECTIVITY\u ACTION
intent(在
onResume()
中设置它,在
onPause()
中释放它)。这应该能捕捉到任何自动Wi-Fi网络交换机。
getOwnIpAddress
WifiManager
检索设备的IP地址


我还发现,当我从另一个活动返回到该活动时,它也能工作。

此时,我已经这样修复了此问题(由于目前没有第二个可用网络,因此尚未对其进行全面测试):

我扩展了BroadcastReceiver类

private class NetworkSwitcher extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (!action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            return;
        }
        NetworkInfo networkInfo =
            (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
        if (networkInfo.isConnected()) {
            if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                Log.d(TAG, "Network type: " + networkInfo.getTypeName() +
                        " Network subtype: " + networkInfo.getSubtypeName());
                getOwnIpAddress();
                mClient.updateUnicastSocket(mOwnAddress, mUnicastPort);
            }
        } 
        else {
            Log.e(TAG, "Network connection lost");
        }
    }
}
我将该类注册为接收器,并将筛选器设置为
ConnectivityManager.CONNECTIVITY\u ACTION
intent(在
onResume()
中设置它,在
onPause()
中释放它)。这应该能捕捉到任何自动Wi-Fi网络交换机。
getOwnIpAddress
WifiManager
检索设备的IP地址


我还发现,当我从另一个活动返回到该活动时,它会起作用。

该问题的可能重复似乎回答了如何检测网络是否连接或断开的问题。我需要知道网络之间何时发生切换。你可以使用相同的代码。如果类型为Wifi,请使用NetworkInfo获取数据。例如,各种WiFi n/WSN的BSSID应该不同,如果我没有弄错的话,这将涉及缓存当前网络的BSSID并将其与新网络进行比较?如果是这样,我宁愿不要,因为我只需要更新网络交换机来检索新的IP地址。。。我不需要知道网络的BSSID。是的,但这是判断这个问题可能重复的最简单方法,它似乎回答了如何检测网络是否连接或断开。我需要知道网络之间何时发生切换。你可以使用相同的代码。如果类型为Wifi,请使用NetworkInfo获取数据。例如,各种WiFi n/WSN的BSSID应该不同,如果我没有弄错的话,这将涉及缓存当前网络的BSSID并将其与新网络进行比较?如果是这样,我宁愿不要,因为我只需要更新网络交换机来检索新的IP地址。。。我不需要知道网络的BSSID。是的,但这是告诉我这是被OP接受的最简单的方法,但我认为它不会起作用。文档建议使用WifiManager而不是ConnectivityManager来完成您描述的这类操作,因此您可以使用WifiManager.NETWORK\u STATE\u CHANGED\u操作,但我不确定这是否会起到作用:当您的客户端从一个BSSID漫游到下一个BSSID时通知您(如果我正确理解了问题).实际上,这可能是一个更好的解决方案。虽然我不再使用这个应用程序了(也许以后还会使用)。如果我知道WifiManager,我也会这么做。
WifiManager.NETWORK\u STATE\u CHANGED\u ACTION
将完全按照@Tom在中所说和提到的方法来做,我意识到这是一个被认可的(OP)方法,但我认为它不会起作用。文档建议使用WifiManager而不是ConnectivityManager来完成您描述的这类操作,因此您可以使用WifiManager.NETWORK\u STATE\u CHANGED\u操作,但我不确定这是否会起到作用:当您的客户端从一个BSSID漫游到下一个BSSID时通知您(如果我正确理解了问题).实际上,这可能是一个更好的解决方案。虽然我不再使用这个应用程序了(也许以后还会使用)。如果我知道WifiManager,我也会这么做。
WifiManager.NETWORK\u STATE\u CHANGED\u ACTION
将完全按照@Tom在