判断andorid开发中网络状态变化

本文介绍了在Android开发中如何使用ConnectivityManager监控网络状态,包括GPRS、WIFI、UMTS等。主要方法包括获取活跃网络信息、判断网络是否可用、是否连接、是否漫游及是否计费。此外,还提及了网络类型的识别,如移动数据和WIFI数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值