如何收听Android网络的变化

时间:2015-02-26 03:44:46

标签: java android

我想开发一个应用程序保持与服务器的TCP连接一段时间(比如一两分钟),但我必须考虑设备的IP已更改,因为客户端可能在此期间移动。所以我想知道如何确定Android设备是否改变了其网络环境(从Wifi转为4G或反之亦然)特别是由于任何网络环境发生变化,设备的公共IP是否发生了变化?

感谢

1 个答案:

答案 0 :(得分:5)

在我看来,你想要的是一个接收连接变化广播的广播接收器。收到广播时,您可以确定设备是否已连接到网络,然后尝试与服务器建立TCP连接。当设备更改网络时,从Wifi到3g / 4g或反之亦然,此接收器应接收广播。

以下是我用于此类用例的示例:

    public class InternetStatusListener extends BroadcastReceiver {
private static final String TAG="INTERNET_STATUS";
@Override
public void onReceive(Context context, Intent intent) {
    Log.e(TAG, "network status changed");
    if(InternetStatusListener.isOnline(context)){//check if the device has an Internet connection
        //Start a service that will make your TCP Connection.

    }
}
}
  public static boolean isOnline(Context context) {
    ConnectivityManager cm =
            (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    if (netInfo != null && netInfo.isConnectedOrConnecting()) {
        return true;
    }
    return false;
}

我希望这会对你有所帮助。可能还有其他更好的方法,但这就是我使用的方法。

此外,您必须将这些添加到您的Android清单文件中:

      <receiver
android:name=".InternetStatusListener"
android:label="InternetStatusListener" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver> 
<!-- Put these permissions too.-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />