Android获取网络状态

【Android获取网络状态】黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述Android获取网络状态相关的知识,希望能为你提供帮助。
android获取网络状态 学习自

  • https://developer.android.google.cn/reference/android/net/ConnectivityManager
  • http://www.cnblogs.com/qingblog/archive/2012/07/19/2598983.html
Overview
在做Android app的时候,网络的状态可能会经常的变化,当用户当前没有网络的时候,我们要保证程序不崩溃,而在当用户使用流量的话,则需要确保,在进行耗流量的操作的时候,需要给予用户警告(比如看视频,播放音乐,下载等).
想要获取网络状态的话,我们需要通过 ConnectivityManager 类来实现,该类负责与 NetworkManagementService 系统服务进行交互来获取网络相关的信息。我们先来看一下官方文档是如何描述这个类的:
Class that answers queries about the state of network connectivity. It also notifies applications when network connectivity changes.
该类负责回答关于网络连接的状态的问题。 当网络连接发生改变的时候也会通知应用。
The primary responsibilities of this class are to:
该类的主要责任是:
  • Monitor network connections (Wi-Fi, GPRS, UMTS, etc.)
  • 监听网络连接(Wifi,GPRS,UMTS等)
  • Send broadcast intents when network connectivity changes
  • 当网络状态发生改变的时候,发送广播
  • Attempt to "fail over" to another network when connectivity to a network is lost
  • 当网络连接丢失后,尝试连接到另一个网络
  • Provide an API that allows applications to query the coarse-grained or fine-grained state of the available networks
  • 提供一个API来允许应用查询粗粒度或细粒度的可用网络的状态
  • Provide an API that allows applications to request and select networks for their data traffic
  • 提供一个API允许应用为他们的数据流量请求或者选择网络
可以通过下面的方式获取此类的实例
val connectivityManager: ConnectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManagerval connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager

小贴士,请不要忘记添加 android.permission.ACCESS_NETWORK_STATE权限。
NetworkInfo
NetworkInfo 是一个描述网络连接状态的接口,我们主要通过这个类来获取网络的状态。
val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo

常用的功能
判断网络是否连接
/** * 判断网络是否可用 * */ fun isAvailable(context: Context): Boolean { val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo if (networkInfo != null) { return networkInfo.isAvailable } return false }

判断是否是移动数据
fun isMobile(context: Context): Boolean { val connectivityManager: ConnectivityManager = context.getSystemService(ConnectivityManager::class.java) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo if (networkInfo != null) { return networkInfo.type == ConnectivityManager.TYPE_MOBILE } return false }

监听网络的变化
从官方文档我们可以知道,如果要想监听到网络的变化的,那么需要我们动态注册一个广播才行。
val networkStatusChangeReceiver = object : BroadcastReceiver() { @SuppressLint("ServiceCast") override fun onReceive(context: Context?, intent: Intent?) { val connectivityManager: ConnectivityManager = context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkInfo = connectivityManager.activeNetworkInfo if (networkInfo != null & & networkInfo.isAvailable) { tvNetworkStatus.text = "Current Network Status: Available" } else { tvNetworkStatus.text = "Current Network Status: unavailable" } } }override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) //注册一个广播 val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION) this.registerReceiver(this.networkStatusChangeReceiver, filter) }override fun onDestroy() { this.unregisterReceiver(this.networkStatusChangeReceiver) super.onDestroy() }


    推荐阅读