关键类

ConnectivityManager类,可以获取网络状态信息。

权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
复制代码

基本使用

  1. 获取ConnectivityManager的实例
Context context = getApplicationContext();
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
复制代码
  1. 获取NetworkInfo对象
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
复制代码
  1. 调用NetworkInfo的相应方法

NetworkInfo类:isConnected、isAvailable、getType等。

isConnected和isAvailable的区别

场景 输出
显示连接已保存,但标题栏没有,即没有实质连接上 not connect, available
显示连接已保存,标题栏也有已连接上的图标 connect, available
选择不保存后 not connect, available
选择连接,在正在获取IP地址时 not connect, not available
连接上后 connect, available

代码

/*** 网络工具类* Created by zhoujingxin on 2018/1/23.*/public class NetworkUtils {public static final int NETWORK_TYPE_NONE = 0;public static final int NETWORK_TYPE_WIFI = 1;public static final int NETWORK_TYPE_2G = 2;public static final int NETWORK_TYPE_3G = 3;public static final int NETWORK_TYPE_4G = 4;/*** 判断当前是否有网络连接** @param context* @return true:数据网络或者wifi;false:没有开启任何网络*/public static boolean isNetworkConnected(Context context) {if (context != null) {ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = manager.getActiveNetworkInfo();if (networkInfo != null) {return networkInfo.isAvailable() && networkInfo.isConnected();}}return false;}/*** Wifi网络当前是否连接** @param context* @return 只开启wifi时,返回true;同时开启wifi和数据网络时,返回true;*/public static boolean isWifiConnected(Context context) {if (context != null) {ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = manager.getActiveNetworkInfo();if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {return networkInfo.isAvailable() && networkInfo.isConnected();}}return false;}/*** 数据网络当前是否连接** @param context* @return 只开启数据网络时,返回true;同时开启wifi和数据网络时会返回false;*/public static boolean isMobileConnected(Context context) {if (context != null) {ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = manager.getActiveNetworkInfo();if (networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {return networkInfo.isAvailable() && networkInfo.isConnected();}}return false;}/*** 通过反射获取数据网络是否连接* 可以在wifi和数据网络同时开启时使用* @param context* @return*/public static boolean isMobileDataEnabled(Context context) {try {ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);Method getMobileDataEnabled = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled");getMobileDataEnabled.setAccessible(true);boolean dataEnabled = (boolean) getMobileDataEnabled.invoke(connectivityManager);return dataEnabled;} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return false;}/*** 获取当前连接的网络的类型* 原生** @param context* @return*/public static int getConcreteNetworkType(Context context) {if (context != null) {ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = manager.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isAvailable()) {return networkInfo.getType();}}return -1;}/*** 获取当前的网络状态 :没有网络-0:WIFI网络1:4G网络-4:3G网络-3:2G网络-2* 自定义** @param context* @return*/public static int getSimpleNetworkType(Context context) {//结果返回值int netType = NETWORK_TYPE_NONE;//获取手机所有连接管理对象ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);//获取NetworkInfo对象NetworkInfo networkInfo = manager.getActiveNetworkInfo();//NetworkInfo对象为空 则代表没有网络if (networkInfo == null) {return netType;}//否则 NetworkInfo对象不为空 则获取该networkInfo的类型int nType = networkInfo.getType();if (nType == ConnectivityManager.TYPE_WIFI) {//WIFInetType = NETWORK_TYPE_WIFI;} else if (nType == ConnectivityManager.TYPE_MOBILE) {int nSubType = networkInfo.getSubtype();TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);//3G   联通的3G为UMTS或HSDPA 电信的3G为EVDOif (nSubType == TelephonyManager.NETWORK_TYPE_LTE&& !telephonyManager.isNetworkRoaming()) {netType = NETWORK_TYPE_4G;} else if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS|| nSubType == TelephonyManager.NETWORK_TYPE_HSDPA|| nSubType == TelephonyManager.NETWORK_TYPE_EVDO_0&& !telephonyManager.isNetworkRoaming()) {netType = NETWORK_TYPE_3G;//2G 移动和联通的2G为GPRS或EGDE,电信的2G为CDMA} else if (nSubType == TelephonyManager.NETWORK_TYPE_GPRS|| nSubType == TelephonyManager.NETWORK_TYPE_EDGE|| nSubType == TelephonyManager.NETWORK_TYPE_CDMA&& !telephonyManager.isNetworkRoaming()) {netType = NETWORK_TYPE_2G;} else {netType = NETWORK_TYPE_2G;}}return netType;}}
复制代码

注意:

  • isWifiConnected和isMobileConnected方法只能用于判断当前所使用的网络;也就是说,如果当前wifi和数据网络同时开启,isWifiConnected会返回true,而isMobileConnected会返回false;
  • 如果希望同时判断数据网络是否也连接的话,可以调用isMobileDataEnabled方法;该方法通过反射调用ConnectivityManager中@hide标记的getMobileDataEnabled的方法来进行判断。

监听网络状态变化

  1. 自定义广播接收器
    可能用到WifiManager类。
  2. 静态注册广播
<receiver android:name=".NetWorkStateReceiver"><intent-filter><action android:name="android.net.conn.CONNECTIVITY_CHANGE"/><action android:name="android.Net.wifi.WIFI_STATE_CHANGED" /><action android:name="android.net.wifi.STATE_CHANGE" /></intent-filter>
</receiver>
复制代码

如果只使用CONNECTIVITY_CHANGE的话,在7.0以上会收不到广播。

  1. 动态注册广播
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(netWorkStateReceiver, filter);
复制代码

参考资料

  • http://www.cnblogs.com/ccdc/p/4432583.html
  • https://www.jianshu.com/p/10ed9ae02775
  • http://www.10tiao.com/html/227/201612/2650238011/1.html

Android笔记-网络篇:网络状态相关推荐

  1. iOS开发网络篇—网络编程基础

    一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新 ...

  2. 网络篇-网络分层的含义

    OSI 七层模型 这是一个理想化的模型,给我们的网络划分了层次. 我们可以将复杂的内容简单化,每一层都专人做专事 [最底层]物理层:只关心如何传输数据,传输的是比特流 数据链路层:主要关心的是将两个设 ...

  3. daliu_IT学习Android笔记第一篇--Android是什么?安卓的logo来源?安卓的发展过程?

    Android是什么?安卓的logo来源?安卓的发展过程?   安卓的名字: Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公 ...

  4. iOS开发网络篇—网络请求(HTTP协议)小结(转)

    1. 聊一下HTTP协议(协议的完整的通信过程) 2.通信过程 1> 请求 * 客户端 --> 服务器 * 请求的内容 a. 请求行(请求方法\HTTP协议\请求资源路径) b. 请求头( ...

  5. Vue学习笔记进阶篇——Render函数

    本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...

  6. Android学习笔记第五篇--网络连接与云服务(一)

    Android学习笔记第五篇–网络连接与云服务 第一章.无线连接设备 ​ 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相 ...

  7. Android面试题网络篇

    Android面试题网络篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐. 系列文章目录: Android面试题View篇 Android面试题进程篇 Android面试题线程篇 T ...

  8. android编程获取网络和wifi状态及调用网络设置界面,Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面 - Android平台开发技术 - 博客园...

    获取网络连接状态 随着3G和Wifi的推广,越来越多的Android应用程序需要调用网络资源,检测网络连接状态也就成为网络应用程序所必备的功能. Android平台提供了ConnectivityMan ...

  9. 菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)

    菜鸟学习笔记:Java提升篇9(网络1--网络基础.Java网络编程) 网络基础 什么是计算机网络 OS七层模型 Java网络编程 InetAddress InetSocketAddress URL类 ...

  10. Android开发之APN网络切换

    原文:http://www.cnblogs.com/hanyonglu/archive/2012/03/29/2423298.html 本文介绍Android平台中关于APN网络切换的相关知识以及如何 ...

最新文章

  1. 数据结构之【树形结构】复习题
  2. 深度学习、自然语言处理和表征方法
  3. mysql触发器 while循环_mysql触发器跳出当前循环方法
  4. 怎样将employee 加到Territory里
  5. 设计模式之——工厂方法模式
  6. LeetCode MySQL 1270. 向公司CEO汇报工作的所有人
  7. android addtextchangedlistener参数,【Android】关于addTextChangedListener()方法的上机记录...
  8. 从1行代码到20万行开源,我已经走过了三年
  9. 分享整理的 Python 学习路线图,(附工具+视频+书籍+面试)
  10. 安装360后,visual studio 经常报各种莫名其妙的错误的解决方案
  11. 移动端使用的WebKit私有属性(转)
  12. 大数据环境搭建之hadoop完全分布式搭建
  13. LINUX SHELL中for用数组循环
  14. 操作系统——零碎概念
  15. Android之ViewStub
  16. GlobalMapper20坐标转换
  17. Eclipse中maven项目update project后项目编码会自动变成GBK的问题
  18. 世界由物质、能量、信息
  19. 静态路由的配置,实现全网可达
  20. JS原型对象和JS原型链

热门文章

  1. linux关于tcp协议ack的实现--发送端对ack的处理
  2. 宁波Uber优步司机奖励政策(1月18日~1月24日)
  3. (转)利用libcurl和国内著名的两个物联网云端通讯的例程, ubuntu和openwrt下调试成功(四)...
  4. 定时PING下IP地址,检测该服务器是否还活着。 smokeping
  5. 构建多域名Exchange 2010邮件系统
  6. 有一种爱,永远也无法逾越
  7. 卡方 matlab,matlab卡方分布 卡方检验(Chi-square test)及其MATLAB实现 - 余姚娱乐网
  8. kafka怎么查看消息堆积_Kafka集群消息积压问题及处理策略
  9. Tungsten Fabric SDN — 网络协议
  10. CentOS7 通过 YUM 升级 VIM8