今天,简单讲讲android里如何解决getNetworkInfo过时的问题。
之前,我写了一篇博客,讲如何获取手机是否连网,其中有的代码用到了ConnectivityManager 的getNetworkInfo函数,但是最近检查代码时,发现getNetworkInfo已经过时,所以在网上查找了资料,发现关于这个的不多。但是还是有替代的函数判断手机是否联网。这里记录一下。
描述了当前网络 Mobile和Wifi的状态。
有2个内部类 NetworkInfo.DetailedState(精确的网络状态)和 NetworInfo.State(粗略的网路状态)
Detailed state | Coarse-grained state |
IDLE | DISCONNECTED |
SCANNING | CONNECTING |
CONNECTING | CONNECTING |
AUTHENTICATING | CONNECTING |
CONNECTED | |
DISCONNECTING | DISCONNECTING |
DISCONNECTED | DISCONNECTED |
UNAVAILABLE | DISCONNECTED |
FAILED | DISCONNECTED |
里面几个常用函数
isAvailable() isConnected() getDetailedState() getState() getExtrInfo()
getType() 获取当前网络的类型mobile or Wi-Fi
getTypeName() 获取当前网络的类型名 “WIFI” or “MOBILE”
ConnectivityManager
用于查询网络连接状态,当网络状态发生改变时通知应用。通过调用Context.getSystemService(Context.CONNECTIVITY_SERVICE)。主要功能:
1. 监视网络(Wi-Fi,GPRS,UMTS,etc)的连接
2. 网络状态发生改变时发送广播
3. 网络丢失时尝试转移的别的网络
4. 提供API
主要函数介绍
1. NetworkInfo getActiveNetworkInfo() 获取可用网络(可用)
2. NetworkInfo[] getAllNetworkInfo 获取所有可用网络(已经过时)
3. NetworkInfo getNetworkInfo(int networkType) 获取固定网络信息 (已经过时)
4. isNetworkTypeValid(int networkType)
Android判断当前网络状态是否连接函数
Public static Boolean isNetworkConnected(Context context) {
ConnectivityManager manager = (ConnectivityManager) context
.getApplicationContext().getSystemService(
Context.CONNECTIVITY_SERVICE);
if (manager == null) {
return false;
}
NetworkInfo networkinfo = manager.getActiveNetworkInfo();
if (networkinfo == null || !networkinfo.isAvailable()) {
return false;
}
return true;
}
或者这样也可以
/**
* 网络是否可用
*
* @param activity
* @return
*/
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity == null) {
} else {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
}
return false;
}
更加严谨的写法:
public static boolean checkNet(Context context) {
try {
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
} catch (Exception e) {
return false;
}
return false;
}
简单讲讲,其实就是使用了ctiveNetworkInfo()替代了已经过时的getNetworkInfo(int networkType) ,这样就可以判断手机网络是否连接。如果判断网络类型,那怎么办呢?
/**
* 判断当前网络是否是wifi网络
* if(activeNetInfo.getType()==ConnectivityManager.TYPE_MOBILE) { //判断3G网
*
* @param context
* @return boolean
*/
public static boolean isWifi(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null
&& activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
return true;
}
return false;
}
/**
* 判断当前网络是否是3G网络
*
* @param context
* @return boolean
*/
public static boolean is3G(Context context) {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null
&& activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
return true;
}
return false;
}
}
android 解决getNetworkInfo过时就讲完了。
就这么简单。