ConnectivityManager有四個主要任務:
1、監聽手機網絡狀態(包括GPRS,WIFI, UMTS等)
2、手機狀態發生改變時,發送廣播
3、當一個網絡連接失敗時進行故障切換
4、爲應用程序提供可以獲取可用網絡的高精度和粗糙的狀態
android平臺手機來說:可能會存在4中狀態
1.無網絡(這種狀態可能是因爲手機停機,網絡沒有開啓,信號不好等原因)
2.使用WIFI上網
3.CMWAP(中國移動代理)
4.CMNET上網
常用方法
ConnectivityManager mConnManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnManager.getActiveNetworkInfo();
然後結合判斷其狀態來判斷當前網絡狀況
getActiveNetworkInfo()
返回有關當前活動的默認數據網絡的詳細信息。 當連接時,此網絡是傳出連接的默認路由
。您應該始終檢查isConnected()當沒有默認值時,這可能返回null
isConnected和isAvailable的 區別
isAvailable()—指示是否可以進行網絡連接。
網絡不可用的狀態
當持續或半持久狀態阻止連接網絡的可能性
(1)該設備不在任何此類網絡的覆蓋範圍內。
(2)設備位於家庭網絡以外的網絡(即漫遊)上
(3)數據漫遊已被禁用
(4)啓用了飛行模式
isConnected()–牽涉到網絡讀寫數據時,請調用此方法
指示網絡連接是否存在,並且可以建立連接和傳遞數據。在嘗試執行數據事務之前,始終
調用此方法。
isConnectedOrConnecting()
指示網絡連接是否存在或正在被建立中。 這對於需要的應用程序是有好處的
做任何與網絡相關的數據,而不是讀或寫數據
isRoaming()
指示設備當前是否正在該網絡上漫遊。當返回true時,建議在此網絡上使用數據
isMetered()
如果此網絡被計量,則返回。 網絡被分類爲計量
當用戶對該連接上的大量數據使用敏感,當因爲貨幣成本,數據限制或電池/性能問題。
您在進行大量數據傳輸之前應該檢查一下,並警告用戶或延遲操作,直到另一個網絡可用
isFailover()
指示當前嘗試連接到網絡由ConnectivityManager嘗試故障切換到這一點網絡與其他網絡斷
開連接,如果這是故障切換嘗試則返回true
通過判斷mNetworkInfo.getType()是以下哪一種類型
ConnectivityManager.TYPE_MOBILE:移動數據
ConnectivityManager.TYPE_WIFI:WIFI數據
public class NetWorkUtil {
private static final int CMNET = 1;
private static final int WIFI = 2;
private static final int CMWAP = 3;
//判斷網絡是否可用
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null&&mNetworkInfo.isConnected()) {
return mNetworkInfo.isAvailable();
}
}
return false;
}
//判斷WiFi是否打開
public static boolean isWiFiConnected(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (mWiFiNetworkInfo != null && mWiFiNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI
&&mWiFiNetworkInfo.isConnected()) {
return mWiFiNetworkInfo.isAvailable();
}
return false;
}
//判斷移動數據是否打開
public static boolean isMobileConnected(Context context) {
if (context != null) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mMobileNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (mMobileNetworkInfo != null && mMobileNetworkInfo.isConnected() &&
mMobileNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
return mMobileNetworkInfo.isAvailable();
}
}
return false;
}
//獲取連接類型
public static int getConnectedType(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
return mNetworkInfo.getType();
}
}
return -1;
}
//判斷網絡連接是否可用
public static boolean isNetworkAvailable(Context context) {
if(context!=null) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
} else {
NetworkInfo[] networkInfo = connectivityManager.getAllNetworkInfo();
if (networkInfo != null && networkInfo.length > 0) {
for (int i = 0; i < networkInfo.length; i++) {
if (networkInfo[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
}
return false;
}
public static void isConnected(Context context) {
ConnectivityManager manger = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manger.getActiveNetworkInfo();
//判斷是否有網絡連接
if(info!=null&&info.isConnected()) {
ToastUtil.getInstance().showToast(context,"網絡已連接");
} else {
ToastUtil.getInstance().showToast(context,"網絡連接失敗");
if(Build.VERSION.SDK_INT >= 11){
//3.0以上打開設置界面,也可以直接用ACTION_WIRELESS_SETTINGS打開到wifi界面
context.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
} else {
context.startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));
}
}
}
public static int getAPNType(Context context){
int netType = -1;
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if(networkInfo==null){
return netType;
}
int nType = networkInfo.getType();
if(nType==ConnectivityManager.TYPE_MOBILE){
Log.e("ExtraInfo", "ExtraInfo is "+networkInfo.getExtraInfo());
if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){
netType = CMNET;
} else{
netType = CMWAP;
}
} else if(nType==ConnectivityManager.TYPE_WIFI){
netType = WIFI;
}
return netType;
}
}