android 监听网络状态的改变

  对于移动端来说,基本上大多数数据都是来自于网络端的数据传输,网络的状态监听就显得很有必要性!恰逢这两天做实际工作中用到了这个小功能,在此做下记录吧!
  

简述

  思路还是用广播监听网络状态,网络状态简单来说就是有网和无网的状态,细分的话可就多了,WIFI,移动GPRS,2G,3G,4G和5G状态,在此先简单区分即可,思路大都相同。另多记录一句,在21版本时加入了NetworkCallback类来监听网络状态的变化,官方提议在28及以上通过NetworkCallback的方式来监听网络,但实际中目前还是有相当一部分低版本,暂不考虑

  1. 定义一个简单的工具类
/**
 * 网络工具类
 */
public class NetUtil {
    /**
     * 没有网络
     */
    private static final int NETWORK_NONE = -1;
    /**
     * 移动网络
     */
    private static final int NETWORK_MOBILE = 0;
    /**
     * 无线网络
     */
    private static final int NETWORK_WIFI = 1;

    public static int getNetWorkState(Context context) {
        //得到连接管理器对象
        ConnectivityManager connectivityManager = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetworkInfo = connectivityManager
                .getActiveNetworkInfo();
        //如果网络连接,判断该网络类型
        if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
                return NETWORK_WIFI;//wifi
            } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
                return NETWORK_MOBILE;//mobile
            }
        } else {
            //网络异常
            return NETWORK_NONE;
        }
        return NETWORK_NONE;
    }
}

  1. 继承广播,监听网络变化
public class NetChangeReceiver extends BroadcastReceiver {
    public NetChangeListener listener;

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        // 如果相等的话就说明网络状态发生了变化
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            int netWorkState = NetUtil.getNetWorkState(context);
            // 当网络发生变化,判断当前网络状态,并通过NetEvent回调当前网络状态
            if (listener != null) {
                listener.onChangeListener(netWorkState);
            }
        }
    }

    // 自定义接口
    public interface NetChangeListener {
        void onChangeListener(int status);
    }

    public void setNetChangeListener(NetChangeListener changeListener) {
        this.listener = changeListener;
    }
}


  1. 具体业务实现上,一般此类的监听都是放在全局中使用的,所以最好的是放在基类中实现,一般在BaseActivity中实现,部分代码块如下
 private NetChangeReceiver netBroadcastReceiver;
    //检查网络
    private void checkNet() {
        netBroadcastReceiver = new NetChangeReceiver();
        netBroadcastReceiver.setNetChangeListener(this);
        //Android 7.0以上需要动态注册
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //实例化IntentFilter对象
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            //注册广播接收
            registerReceiver(netBroadcastReceiver, filter);
        }
    }

以上代码中对于7.0及以上做出了一些处理,是由于在7.0及其以上的版本中,必须要动态的注册广播,才能响应

 /**
     * 网络类型
     */
    private int netType;

    @Override
    public void onChangeListener(int status) {
        this.netType = status;
        if (isNetConnect()) {
          //TODO 有网时操作
        }else{
          //TODO 无网时的操作
        }
    }

    /**
     * 判断有无网络 。
     *
     * @return true 有网, false 没有网络.
     */
    public boolean isNetConnect() {
        if (netType == 1) {
            return true;
        } else if (netType == 0) {
            return true;
        } else if (netType == -1) {
            return false;
        }
        return false;
    }

对于网络的监听也就处理完了,若是想细分的话也简单,在获取网络状态时

    /**
     * 获取移动网络的类型
     * 
     * @param context
     * @return 移动网络类型
     */
    public static final int getMobileNetType(Context context) {
 
        mTelephonyManager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        int networkType = mTelephonyManager.getNetworkType();
 
        return getNetworkClass(networkType);
    }
 
    /**
     * 判断移动网络的类型
     * 
     * @param networkType
     * @return 移动网络类型
     */
    private static final int getNetworkClass(int networkType) {
        switch (networkType) {
        case TelephonyManager.NETWORK_TYPE_GPRS:
        case TelephonyManager.NETWORK_TYPE_EDGE:
        case TelephonyManager.NETWORK_TYPE_CDMA:
        case TelephonyManager.NETWORK_TYPE_1xRTT:
        case TelephonyManager.NETWORK_TYPE_IDEN:
            return NETWORK_2G;
        case TelephonyManager.NETWORK_TYPE_UMTS:
        case TelephonyManager.NETWORK_TYPE_EVDO_0:
        case TelephonyManager.NETWORK_TYPE_EVDO_A:
        case TelephonyManager.NETWORK_TYPE_HSDPA:
        case TelephonyManager.NETWORK_TYPE_HSUPA:
        case TelephonyManager.NETWORK_TYPE_HSPA:
        case TelephonyManager.NETWORK_TYPE_EVDO_B:
        case TelephonyManager.NETWORK_TYPE_EHRPD:
        case TelephonyManager.NETWORK_TYPE_HSPAP:
            return NETWORK_3G;
        case TelephonyManager.NETWORK_TYPE_LTE:
            return NETWORK_4G;
        default:
            return NETWORK_UNKNOW;
        }
    }
}

后面还会有5G,6G甚至7G,VPN类似的都是大同小异,当然可能也会有封装的更好的API出现,进击从未停止,当然,还有权限注册不要忘记

		<uses-permission android:name="android.permission.INTERNET" /> <!-- 联网 -->
		<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
		.........
		.........
 		<!--监听网络变化-->
        <receiver android:name=".NetChangeReceiver">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>

你可能感兴趣的:(随笔小计,android,网络监听)