欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android 判定网络连接状态 以及监听网络链接状态的变化

程序员文章站 2024-01-16 21:37:28
...

在实习的项目中经常会有需要判定网络链接状态和坚听网络状态变化的需求,由于经常会用到这个,我也将判定当前网络状态的代码封装成一个工具类,并结合这个工具类写了一个专门的网络状态监听器,结合接口来让app在不同的网络状态下做不同的事情,让app更加人性化,实习的时候没有多少时间总结,现在来总结一下。


1.判定当前网络状态是否连接:根据系统版本的不一样,获取的方式不一样,界限是21即 android.os.Build.VERSION_CODES.LOLLIPOP

系统版本小于21之前,使用以下的方式获取当前网络状态:先利用Context对象获取ConnectivityManager对象,然后利用ConnectivityManager对象获取NetworkInfo对象,然后根据NetworkInfo对象的类型来返回不同的网络状态。有三种,移动,Wi-Fi,无网络连接。

系统21及之后,获取网络连接状态的方式:利用ConnectivityManager对象获取所有的网络连接信息,然后遍历每个网络连接,获取相应的NetworkInfo,然后根据NetworkInfo对象的类型来返回不同的网络状态。


以下是封装好的工具类:

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.widget.Toast;

/**
 * Created by Yang on 2017/8/15.
 */

public class NetUtil {
    /**
     * 没有连接网络
     */
    public static final int NETWORK_NONE = -1;
    /**
     * 移动网络
     */
    public static final int NETWORK_MOBILE = 0;
    /**
     * 无线网络
     */
    public static final int NETWORK_WIFI = 1;

    public static Context mContext;

    public static void init(Context context) {
        mContext = context;
    }


    public static int getNetWorkState() {
        if (mContext == null) {
            throw new UnsupportedOperationException("please use NetUtils before init it");
        }
        // 得到连接管理器对象
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {

            ConnectivityManager connectivityManager = (ConnectivityManager) mContext
                    .getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetworkInfo = connectivityManager
                    .getActiveNetworkInfo();
            if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
                if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
                    return NETWORK_WIFI;
                } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
                    return NETWORK_MOBILE;
                }
            } else {
                return NETWORK_NONE;
            }

        }else{
            ConnectivityManager connMgr = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);

            //获取所有网络连接的信息
            Network[] networks = connMgr.getAllNetworks();
            //通过循环将网络信息逐个取出来
            for (int i=0; i < networks.length; i++){
                //获取ConnectivityManager对象对应的NetworkInfo对象
                NetworkInfo networkInfo = connMgr.getNetworkInfo(networks[i]);
                if (networkInfo.isConnected()) {
                    if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
                        return NETWORK_MOBILE;
                    }else{
                        return NETWORK_WIFI;
                    }
                }
            }


        }
        return NETWORK_NONE;
    }
}

2.监听系统网络状态的变化:

public class NetBroadcastReceiver extends BroadcastReceiver {
    private final static String TAG = "NetBroadcastReceiver";
    public static NetEvevt evevt;
    @Override
    public void onReceive(final Context context, Intent intent) {
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            int netWorkState = NetUtil.getNetWorkState();
            if (evevt != null) {
                evevt.onNetChange(netWorkState);
            }
        }
    }
    // 自定义接口
    public interface NetEvevt {
        public void onNetChange(int netMobile);
    }

    public static void setEvevt(NetEvevt evevt1) {
        evevt = evevt1;
    }
}

通过接口,你可以根据不同的网络状态来做不同的事情。

静态注册网络状态监听器在7.0即系统24之后是失效的,接收不到系统广播的。只能通过动态注册

注册监听网络状态监听器的时候请注意声明相对应的权限!!!

以上就是所有关于判定网络状态以及监听网络状态的博客啦,希望对你有所帮助,谢谢观看!感谢其他博主的分享!