判斷andorid開發中網絡狀態變化

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;

    }

}
發佈了43 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章