应用程序有时需要检查网络连接状态,有三种方法:
1:通过ConnectivityManager来监控设备的网络连接状态和网络连接类型;
2:通过注册广播BreadcastReceiver来检测网络连接的变化;
3:通过PhoneStateListener来监控设备的网络的连接状态和网络连接类型;
##ConnectivityManager
1:需要加权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
2:获取ConnectivityManager服务:
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
3:得到NetworkInfo:
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
String typeName = info.getTypeName(); //5中网络连接类型:cmwap/cmnet/wifi/uniwap/uninet
info.getType(); // 以何种方式连线 [WIFI]
info.getState(); // 连线状态 [CONNECTED]
info.isAvailable(); // 网络是否可用 [true]
info.isConnected(); // 网络是否已经连接 [true]
info.isConnectedOrConnecting(); // 网络是否已经连接或者连接中 [true]
info.isFailover(); // 网络是否有问题 [false]
info.isRoaming(); // 网络是否在漫游中 [false]
3:实例:
(1)检查网络的连接状态
public boolean isNetworkReachable() {
ConnectivityManager mManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo current = mManager.getActiveNetworkInfo();
if(current == null) {
return false;
}
return (current.getState() == NetworkInfo.State.CONNECTED);
}
注意:如果没有可用的网络连接,NetworkInfo.getActiveNetworkInfo()会返回null;如果有可用的网络,就可以检查其状态,可 能的返回值如下:
● DISCONNECTED
● CONNECTING
● CONNECTED
● DISCONNECTING
如果返回的状态是CONNECTED,说明网络是稳定的可以用来访问远程资源。
(2)判断网络连接类型
public boolean isWifiReachable() {
ConnectivityManager mManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo current = mManager.getActiveNetworkInfo();
if(current == null) {
return false;
}
return (current.getType() == ConnectivityManager.TYPE_WIFI);
}
(3)在网络访问失败时检查网络连通性:
try {
//尝试访问网络资源时,如果失败可能会抛出HttpResponseException 或
//其他IOException 异常
} catch (Exception e) {
if( !isNetworkReachable() ) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("No Network Connection");
builder.setMessage("The Network is unavailable."+ " Please try your request again later.");
builder.setPositiveButton("OK",null);
builder.create().show();
}
}
##由于网络连接的状态发生改变时,会发送广播,所以我们可以通过注册BroadcastReceiver来检测网络连接
1:注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(receiver, filter);
2:定义广播接受者
private BroadcastReceiver receiver = new BroadcastReceiver(){
@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
NetworkInfo aNetworkInfo = (NetworkInfo) bundle.
get(ConnectivityManager.EXTRA_NETWORK_INFO);
}
};
##PhoneStateListener
我们通常使用PhoneStateListener来监听手机的来电,它还可以监听网络连接的类型和状态;
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(new PhoneStateListener(){
@Override
public void onDataConnectionStateChanged(int state, int networkType) {
。。。
}
}, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
onDataConnectionStateChanged()源码:
/**
* Callback invoked when connection state changes.
*
* @see TelephonyManager#DATA_DISCONNECTED
* @see TelephonyManager#DATA_CONNECTING
* @see TelephonyManager#DATA_CONNECTED
* @see TelephonyManager#DATA_SUSPENDED
*/
public void onDataConnectionStateChanged(int state) {
// default implementation empty
}
/**
* same as above, but with the network type. Both called.
*/
public void onDataConnectionStateChanged(int state, int networkType) {
}