Android之ConnectivityManager 網路管理
在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>