权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
ConnectivityManager
ConnectivityManager是网络连接相关的管理器,它主要用于查询网络状态并在网络发生改变时发出状态变化通知。这个类主要负责的下列四个方面:
1. 监控网络状态(包括WiFi, GPRS, UMTS等)。
2. 当网络连接改变时发送广播Intent。
3. 当一种网络断开时,试图连接到另一种网络进行故障处理。
4. 提供一系列接口让应用程序查询可获得的网络的粗粒度和细粒度状态。
比较重要的几个类常量:
int TYPE_BLUETOOTH The Bluetooth data connection. 蓝牙数据连接
int TYPE_ETHERNET The Ethernet data connection. 以太网数据连接
int TYPE_MOBILE The Mobile data connection. 移动数据链接
int TYPE_WIFI The WIFI data connection. wifi链接
常用api
NetworkInfo getActiveNetworkInfo() // 获取当前连接可用的网络
NetworkInfo[] getAllNetworkInfo() // 获取设备支持的所有网络类型的链接状态信息。
NetworkInfo getNetworkInfo(int networkType) // 获取特定网络类型的链接状态信息
NetworkInfo
NetworkInfo是一个描述网络状态的接口,可通过ConnectivityManager调用getActiveNetworkInfo()获得当前连接的网络类型。
NetworkInfo有两个枚举类型的成员变量NetworkInfo.DetailedState和NetworkInfo.State,用于查看当前网络的状态。其中NetworkInfo.State的值包括:
NetworkInfo.State == CONNECTED
//已连接
NetworkInfo.State == CONNECTING
//正在连接
NetworkInfo还包括一系列可用的方法用于判断当前网络是否可用,如下:
getState() // 获取网络连接的粗粒度状态
isAvailable() // 判断当前网络是否可用
isConnected() // 判断当前网络是否存在,并可用于数据传输
getType() // 报告当前网络从属的网络类型
参考:
Android网络编程(二)ConnectivityManager和NetworkInfo详解
isAvailable/isConnected区别:
public class MainActivityI extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(mBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
NetworkInfo aNetworkInfo = (NetworkInfo) bundle.get(ConnectivityManager.EXTRA_NETWORK_INFO);
if (aNetworkInfo != null && aNetworkInfo.isConnected()) {
System.out.println("connecte");
} else {
System.out.println("not connect");
}
if (aNetworkInfo != null && aNetworkInfo.isAvailable()) {
System.out.println("available");
} else {
System.out.println("not available");
}
System.out.println("--------------------");
}
};
}
结论:
isAvailable:是否有可用的网络
isConnected:是否已经连接网络(如果连接则默认可用)
isAvailable 包含 isConnected ,
即isConnected一定isAvailable,isAvailable 不一定 isConnected
getActiveNetworkInfo 和 getNetworkInfo 区别
getActiveNetworkInfo // 是可用的网络,不一定是连接的
getNetworkInfo(int networkType) // 获取特定网络类型的链接状态信息
工具类:
public class NetUtils {
/**
* 判断网络是否可用
*
* @param context
* @return
*/
public static boolean isNetworkAvailable(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (mConnectivityManager != null) {
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {
return true;
}
}
}
return false;
}
/**
* 判断网络是否已连接
*
* @param context
* @return
*/
public static boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null != mConnectivityManager) {
NetworkInfo info = mConnectivityManager.getActiveNetworkInfo();
if (null != info && info.isConnected()) {
return true;
}
}
}
return false;
}
/**
* 获取当前网络连接的类型信息
*
* @param context
* @return
*/
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() && mNetworkInfo.isConnected()) {
return mNetworkInfo.getType();
}
}
return -1;
}
/*-----------------------------------------------------------------------------------------------------------------*/
/**
* 判断是否是wifi连接
*/
public static boolean isWifi(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm != null && cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;
}
/**
* 判断是否是gprs连接
*/
public static boolean isGprs(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm != null && cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_MOBILE;
}
}
常用监听网络变化:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//在onResume()方法注册
@Override
protected void onResume() {
registerReceiver(mBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
System.out.println("注册");
super.onResume();
}
//onPause()方法注销
@Override
protected void onPause() {
unregisterReceiver(mBroadcastReceiver);
System.out.println("注销");
super.onPause();
}
private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (NetUtils.isNetworkConnected(MainActivity.this)) {
System.out.println("网络正常!!!");
} else {
System.out.println("网络异常,请查看网络设置");
}
}
};
}