1. 程式人生 > >android網路請求網路連線狀態判斷 & 監控網路狀態改變

android網路請求網路連線狀態判斷 & 監控網路狀態改變

個人筆記

開發遇到的網路判斷思路

        不能每次網路請求都要去呼叫ConnectivityManager進行網路判斷,所以在程式啟動的時候判斷一次網路狀態,然後全域性記錄這個狀態,每次網路請求的時候只用根據這個記錄的狀態來判斷網路的連線狀態即可,只有當人為的關閉網路或者切換網路的時候才改變全域性的記錄狀態,這個改變使用到廣播。

廣播收聽網路改變狀態:

package com.huiting.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo.State ;

import com.huiting.application.BaseApplication;
import com.huiting.tools.LogUtils;

/**
 * 網路改變監控廣播
 *
 * 監聽網路的改變狀態,只有在使用者操作網路連線開關(wifi,mobile)的時候接受廣播,然後對相應的介面進行相應的操作
 * 適用於下載時候,聽音樂過程中
 *
 * Created by zst on 16/1/27.
 */
public class NetworkChangeReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        State wifiState = null;
        State mobileState = null;

        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
        mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();

        LogUtils.d("網路改變(NetworkChangeReceiver)", "wifi狀態:" + wifiState + "\n mobile狀態:" + mobileState);

        if (wifiState != null && mobileState != null
                && State.CONNECTED != wifiState
                && State.CONNECTED == mobileState) {// 手機網路連線成功
            LogUtils.d("網路改變(NetworkChangeReceiver)", "手機2g/3g/4g網路連線成功");

            BaseApplication.getInstance().setIsMobile(true);
            BaseApplication.getInstance().setIsWifi(false);
            BaseApplication.getInstance().setIsNetworkConn(true);

        } else if (wifiState != null && State.CONNECTED == wifiState) {// 無線網路連線成功
            LogUtils.d("網路改變(NetworkChangeReceiver)", "無線網路連線成功");

            BaseApplication.getInstance().setIsMobile(false);
            BaseApplication.getInstance().setIsWifi(true);
            BaseApplication.getInstance().setIsNetworkConn(true);

        } else if (wifiState != null && mobileState != null
                && State.CONNECTED != wifiState
                && State.CONNECTED != mobileState) {// 手機沒有任何的網路
            LogUtils.d("網路改變(NetworkChangeReceiver)", "手機沒有任何的網路");

            BaseApplication.getInstance().setIsMobile(false);
            BaseApplication.getInstance().setIsWifi(false);
            BaseApplication.getInstance().setIsNetworkConn(false);

        }

    }

}

Application記錄狀態,啟動app時候這裡也進行一次網路判斷和記錄:
/**
 * 當前應用程式
 * 必須在AndroidManifest.xml中寫在application中
 * Created by zst on 15/12/17.
 */
public class BaseApplication extends Application {
    //固定值-使用private防止別的程式修改這些值,然後使用下面的public方法向外邊提供這些值,static一般是不需要二次修改的
    private static BaseApplication application;
    private static int mainTid;//程式執行執行緒id
    private static Handler handler;
    private static TelephonyManager telephonyManager;//裝置標示符

    //網路連線
    private boolean isWifi;//wifi是否連線
    private boolean isMobile;//手機是否連線
    private boolean isNetworkConn;//是否有網