Android获取网络状态

学习自

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 ConnectivityManager val 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()
}

Android获取网络状态的更多相关文章

  1. Android 获取网络状态

    1.检测网络是否可用 public boolean isNetWorkConnected() { ConnectivityManager cm = (ConnectivityManager)getSy ...

  2. Delphi XE5 android 获取网络状态

    unit Androidapi.JNI.Network; interface function IsConnected: Boolean; function IsWiFiConnected: Bool ...

  3. Delphi XE5 android 获取网络状态《转》

    unit Androidapi.JNI.Network; interface function IsConnected: Boolean; function IsWiFiConnected: Bool ...

  4. android开发获取网络状态,wifi,wap,2g,3g.工具类(一)

    android开发获取网络状态整理: package com.gzcivil.utils; import android.content.Context; import android.net.Con ...

  5. Android 监控网络状态

    public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...

  6. React Native之Fetch简单封装、获取网络状态

    1.Fetch的使用 fetch的使用非常简单,只需传入请求的url fetch('https://facebook.github.io/react-native/movies.json'); 当然是 ...

  7. [React Native]获取网络状态

    使用React Native,可以使用NetInfo API获取手机当前的各个网络状态. componentWillMount() { NetInfo.fetch().done((status)=&g ...

  8. iOS 获取网络状态

    在iOS开发者,获取网络状态比较常用 -(NSString *)getNetWorkStates{ UIApplication *app = [UIApplication sharedApplicat ...

  9. 微信小程序 --- 获取网络状态

    获取网络状态:wx.getNetworkType btnclick:function(){ wx.getNetworkType({ success:function(res){ console.log ...

随机推荐

  1. SQL多表联合查询

    通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 在关系数 据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放 ...

  2. LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇

    题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...

  3. YOLO(v1)

    <You Only Look once:Unified,Real-Time Object Dectection> 以前的图像检测网络其实都是在分类网络的基础上进行修改,而YoLo是将检测问 ...

  4. 【转】CString与string、char*的区别和转换

    我们在C++的开发中经常会碰到string.char*以及CString,这三种都表示字符串类型,有很多相似又不同的地方,常常让人混淆.下面详细介绍这三者的区别.联系和转换: 各自的区别 char*: ...

  5. Filter功能

    在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest .根据需要检查HttpServletRequest,也可以修改HttpServletR ...

  6. sqlserver2008r2通过发布和订阅的方式进行数据库同步

    发布服务器:192.168.8.16 订阅服务器:192.168.8.92 发布服务器配置: 选择需要发布的数据库,这里是Attendace_new 订阅服务器配置: 在订阅服务器上新建一个数据库:d ...

  7. svn使用小技巧

    在使用svn的时候,往往导入到eclipse中,使用eclipse进行提交修改,但是当删除文件夹的时候,eclipse会发生冲突,不能够提交. 使用一种方式,将svn上的项目跟你eclipse对应项目 ...

  8. 【 总结 】Tcp Keepalive 和 HTTP Keepalive 详解

    TCP Keepalive Tcp keepalive的起源          双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据 ...

  9. Laravel 禁用指定 URL POST 请求的 csrf 检查

    由于在 chrome 插件中使用了跨域请求,所以需要禁用掉 laravel 默认的 post csrf 检查. 配置方法: 在 app/Http/Middleware/VerifyCsrfToken. ...

  10. mysql替换字符串

    今天要替换数据库里的所有字符串 例如把http改成https UPDATE table_name set colum_name=REPLACE(colum_name,'http','https')