在android平台中ConnectivityManager主要負責查詢網絡連接狀態以及在連接狀態有變化的時候發出通知。其主要的功能職責如下:
1、 監視網絡狀態,包括(Wi-Fi、GPRS、UMTS等)
2、 當網絡狀態發生變化時發送廣播通知
3、 當網絡連接失敗后會嘗試連接其他網絡
4、 為App提供API,用於獲取網絡狀態信息等
該類中提供了一些常量,比如廣播Action、網絡類型等等,具體如下:

公共的方法有:

在上述方法中,常用的有getActivieNetworkInfo、getAllNetworkInfo、getNetworkInfo(int networkType)等,這些方法返回NetworkInfo,該類用於描述網絡的狀態(mobile和wifi)。
在NetworkInfo中定義了兩個內部類,用於枚舉網絡的狀態,兩個內部類分別為NetworkInfo.DetailedState,精確的網絡狀態;NetworkInfo.State,粗略的網絡狀態。
NetworkInfo.DetailedState的枚舉值:

NetworkInfo.State的枚舉值:

二者之間的對應關系:

在NetworkInfo中除了兩個內部類外,還提供了一些方法,如
1、 getDetailedState():返回當前精確的網絡狀態。
2、 getState():返回當前粗略的網絡狀態。
3、 getType():返回當前的網絡類型(mobile或者wi-fi)
4、 getTypeName():返回當前網絡類型的名稱。如“WIFI”或者“MOBILE”
5、 isAvailable():判斷網絡是否有效可用。
6、 isConnected():判斷網絡是否已連接。
下面,我們通過一個案例來展示ConnectityManager的具體用法。核心代碼如下:
public void getNetworkState(View v){
//獲取
ConnectivityManager connectivityManager=
(ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
StringBuilder sb = new StringBuilder();
sb.append("TypeName:").append(networkInfo.getTypeName()).append("\n");
sb.append("Type:").append(networkInfo.getType()).append("\n");
sb.append("isAvailable:").append(networkInfo.isAvailable()).append("\n");
sb.append("isConnected:").append(networkInfo.isConnected()).append("\n");
NetworkInfo.DetailedState state= networkInfo.getDetailedState();
String detailedState="";
if(state== NetworkInfo.DetailedState.AUTHENTICATING){
detailedState="AUTHENTICATING";
}else if(state== NetworkInfo.DetailedState.BLOCKED){
detailedState="BLOCKED";
}else if(state== NetworkInfo.DetailedState.CONNECTED){
detailedState="CONNECTED";
}else if(state== NetworkInfo.DetailedState.CONNECTING){
detailedState="CONNECTING";
}else if(state== NetworkInfo.DetailedState.DISCONNECTED){
detailedState="DISCONNECTED";
}else if(state== NetworkInfo.DetailedState.DISCONNECTING){
detailedState="DISCONNECTING";
}else if(state== NetworkInfo.DetailedState.FAILED){
detailedState="FAILED";
}else if(state== NetworkInfo.DetailedState.IDLE){
detailedState="IDLE";
}else if(state== NetworkInfo.DetailedState.SCANNING){
detailedState="SCANNING";
}else if(state== NetworkInfo.DetailedState.OBTAINING_IPADDR){
detailedState="OBTAINING_IPADDR";
}else if(state== NetworkInfo.DetailedState.SUSPENDED){
detailedState="SUSPENDED";
}
sb.append("DetailedState:").append(detailedState).append("\n");
showState.setText(sb.toString());
}
/**
* 獲取搜有網絡
* @param v
*/
public void getNetwork(View v){
ConnectivityManager connectivityManager=
(ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
StringBuilder stringBuilder = new StringBuilder();
NetworkInfo[] networkInfos= connectivityManager.getAllNetworkInfo();
for(NetworkInfo info:networkInfos){
stringBuilder.append("Name:").append(info.getTypeName())
.append(";isAvailable:").append(info.isAvailable()).append("\n");
}
showNetwork.setText(stringBuilder.toString());
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")){
ConnectivityManager connectivityManager=
(ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo info= connectivityManager.getActiveNetworkInfo();
if(info!=null){
if(info.getState()== NetworkInfo.State.CONNECTED){
showChange.setText("網絡變化:網絡已連接!");
}else{
showChange.setText("網絡變化:網絡已斷開!");
}
}else{
showChange.setText("網絡變化:無網絡!");
}
}
}
};
案例效果如下:

注意,以上代碼需要使用的如下權限:
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

