关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android 检查网络连接状态的代码实现

    Android 检查网络连接状态的代码实现

    2015-03-11 00:00:00 出处:codeceo
    分享

    在Android开发中如何检查网络的连接状态呢?本文将非常详细地介绍Android 检查网络连接状态的代码实现,假如觉得不错,也可以将本文分享给你一起并肩作战的Android开发小伙伴们。

    获取网络信息需要在AndroidManifest.xml文件中加入相应的权限:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    1)判断是否有网络连接

    public boolean isNetworkConnected(Context context) { 
    if (context != null) { 
    ConnectivityManager mConnectivityManager = (ConnectivityManager) context 
    .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); 
    if (mNetworkInfo != null) { 
    return mNetworkInfo.isAvailable(); 
    } 
    } 
    return false; 
    }

    2)判断WIFI网络是否可用

    public boolean isWifiConnected(Context context) { 
    if (context != null) { 
    ConnectivityManager mConnectivityManager = (ConnectivityManager) context 
    .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo mWiFiNetworkInfo = mConnectivityManager 
    .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    if (mWiFiNetworkInfo != null) { 
    return mWiFiNetworkInfo.isAvailable(); 
    } 
    } 
    return false; 
    }

    3)判断MOBILE网络是否可用

    public boolean isMobileConnected(Context context) { 
    if (context != null) { 
    ConnectivityManager mConnectivityManager = (ConnectivityManager) context 
    .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo mMobileNetworkInfo = mConnectivityManager 
    .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    if (mMobileNetworkInfo != null) { 
    return mMobileNetworkInfo.isAvailable(); 
    } 
    } 
    return false; 
    }

    4)获取当前网络连接的类型信息

    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; 
    }

    在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒。一般可以通过ConnectivityManager来完成该工作。

    ConnectivityManager有四个主要任务:

    1、监听手机网络状态(包括GPRS,WIFI, UMTS等)
    2、手机状态发生改变时,发送广播
    3、当一个网络连接失败时进行故障切换
    4、为应用程序提供可以获取可用网络的高精度和粗糙的状态

    当大家要在程序中监听网络状态时,只要一下几个步骤即可:

    1、定义一个Receiver重载其中的onReceive函数,在其中完成所需要的功能,如根据WIFI和GPRS是否断开来改变空间的外观

    connectionReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
    NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
    NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
    if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) { 
    Log.i(TAG, "unconnect"); 
    // unconnect network 
    }else { 
    // connect network 
    } 
    } 
    };

    2、在适当的地方注册Receiver,可以在程序中注册,在onCreate中调用如下函数即可:

    IntentFilter intentFilter = new IntentFilter();
     intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
     registerReceiver(connectionReceiver, intentFilter);

    3、在适当时取消注册Receiver,可以在程序中取消,在onDestroye中调用如下函数即可:

    if (connectionReceiver != null) {
     unregisterReceiver(connectionReceiver);
     }

     

    Ps:网上还有很多关于使用TelephonyManager 的方法的,方法如下(但是我试了好几次都有问题,如每次第一次进入一个Activity时会自动收到网络断开的信号,每次网络状态改变时收到多次回调且状态不正确。不知道有什么要注意的地方,求指点!)

    final TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
    mTelephonyMgr.listen(new PhoneStateListener(){ 
    @Override 
    public void onDataConnectionStateChanged(int state) { 
    switch(state){ 
    case TelephonyManager.DATA_DISCONNECTED://网络断开 
    break; 
    case TelephonyManager.DATA_CONNECTING://网络正在连接 
    break; 
    case TelephonyManager.DATA_CONNECTED://网络连接上 
    break; 
    } 
    } 
    }, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);

    至于第二种方法,本人并没有去尝试过。第一种方式还是比较好用,假如要程序隐藏在后台的话,建议开个service,将BroadcastReceiver注册在service,但不要忘了取消注册。

    在测试中遇到过这样的状况,将一个当前连接wifi的路由设备关闭,但是程序并没有捕捉到unconnect network,可能是因为手机设备立刻连接另一个路由设备了

    Android 监控网络状态

    public static boolean isNetworkAvailable(Context context) { 
    ConnectivityManager connectivity = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivity == null) { 
    Log.i("NetWorkState", "Unavailabel"); 
    return false; 
    } else { 
    NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
    if (info != null) { 
    for (int i = 0; i < info.length; i++) { 
    if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
    Log.i("NetWorkState", "Availabel"); 
    return true; 
    } 
    } 
    } 
    } 
    return false; 
    }

    上面这个方法就是判断网络是否连接的代码,返回true表示有网络,返回false表示无网络。 在Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化。android的网络状态监听可以用BroadcastReceiver来接收网络状态改变的广 播,具体实现如下

    @Override 
    public void onReceive(Context context, Intent intent) { 
    Log.e(TAG, "网络状态改变"); 
    boolean success = false; 
    //获得网络连接服务 
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
    // State state = connManager.getActiveNetworkInfo().getState(); 
    State state = connManager.getNetworkInfo( 
    ConnectivityManager.TYPE_WIFI).getState(); // 获取网络连接状态 
    if (State.CONNECTED == state) { // 判断是否正在使用WIFI网络 
    success = true; 
    } 
    state = connManager.getNetworkInfo( 
    ConnectivityManager.TYPE_MOBILE).getState(); // 获取网络连接状态 
    if (State.CONNECTED != state) { // 判断是否正在使用GPRS网络 
    success = true; 
    } 
    if (!success) { 
    Toast.makeText(LocationMapActivity.this, "您的网络连接已中断", Toast.LENGTH_LONG).show(); 
    } 
    }
    //注册网络监听 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); 
    registerReceiver(mNetworkStateReceiver, filter); 
    //在Activity中的onDestroy中:' 
    unregisterReceiver(mNetworkStateReceiver); //取消监听

    很多朋友在android开发中,都会遇到手机网络类型判断,因为就目前的android平台手机来说:可能会存在4中状态

    1.无网络(这种状态可能是因为手机停机,网络没有开启,信号不好等原因)
    2.使用WIFI上网
    3.CMWAP(中国移动代理)
    4.CMNET上网

    这四种状态,假如没有网络,肯定是无法请求Internet了,假如是wap就需要为手机添加中国移动代理,关于为手机添加中国移动的代理!

    下面是网络判断的方法:

    /** 
    * @author sky 
    * Email vipa1888@163.com 
    * QQ:840950105 
    * 获取当前的网络状态 -1:没有网络 1:WIFI网络2:wap网络3:net网络 
    * @param context 
    * @return 
    */ 
    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("networkInfo.getExtraInfo()", "networkInfo.getExtraInfo() is "+networkInfo.getExtraInfo()); 
    if(networkInfo.getExtraInfo().toLowerCase().equals("cmnet")){ 
    netType = CMNET; 
    } 
    else{ 
    netType = CMWAP; 
    } 
    } 
    else if(nType==ConnectivityManager.TYPE_WIFI){ 
    netType = WIFI; 
    } 
    return netType; 
    }

    因为获取的是服务对象,所以这个网络状态都是时时刷新的,所以我们只需要得到网络状态就可以了!

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。