Android網絡連接狀態查詢及事件監聽工具
最近在項目中,需要檢查終端的網絡連接狀態,及監聽連接狀態變化事件,一切都是為了給用戶更好的體驗,用戶真正會關心的網絡狀態變化事件是“連接(Connected)”和“斷開(Disconnected)”,其他事件是不應該被關注的(都是為了體驗)。
國內主要是兩種網絡,WIFI和GPRS,所以主要是對這兩個網絡進行查詢,其他沒考慮
把工具代碼貼一下,有需要的同學可以省點事兒,避免不必要的重復!package org.dragonboy.net;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.support.v4.net.ConnectivityManagerCompat;
/**
* @author dragonboyorg@qq.com
*/
public class Connectivities {
private Connectivities() {
}
/**
* 檢查當前WIFI是否連接,兩層意思——是否連接,連接是不是WIFI
*
* @param context
* @return true表示當前網絡處于連接狀態,且是WIFI,否則返回false
*/
public static boolean isWifiConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isConnected()
&& ConnectivityManager.TYPE_WIFI == info.getType()) {
return true;
}
return false;
}
/**
* 檢查當前GPRS是否連接,兩層意思——是否連接,連接是不是GPRS
*
* @param context
* @return true表示當前網絡處于連接狀態,且是GPRS,否則返回false
*/
public static boolean isGprsConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isConnected()
&& ConnectivityManager.TYPE_MOBILE == info.getType()) {
return true;
}
return false;
}
/**
* 檢查當前是否連接
*
* @param context
* @return true表示當前網絡處于連接狀態,否則返回false
*/
public static boolean isConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
return true;
}
return false;
}
/**
* 對大數據傳輸時,需要調用該方法做出判斷,如果流量敏感,應該提示用戶
*
* @param context
* @return true表示流量敏感,false表示不敏感
*/
public static boolean isActiveNetworkMetered(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
return ConnectivityManagerCompat.isActiveNetworkMetered(cm);
}
public static Intent registerReceiver(Context context,
ConnectivityChangeReceiver receiver) {
return context.registerReceiver(receiver,
ConnectivityChangeReceiver.FILTER);
}
public static void unregisterReceiver(Context context,
ConnectivityChangeReceiver receiver) {
context.unregisterReceiver(receiver);
}
public static abstract class ConnectivityChangeReceiver extends
BroadcastReceiver {
public static final IntentFilter FILTER = new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION);
@Override
public final void onReceive(Context context, Intent intent) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo wifiInfo = cm
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
NetworkInfo gprsInfo = cm
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
// 判斷是否是Connected事件
boolean wifiConnected = false;
boolean gprsConnected = false;
if (wifiInfo != null && wifiInfo.isConnected()) {
wifiConnected = true;
}
if (gprsInfo != null && gprsInfo.isConnected()) {
gprsConnected = true;
}
if (wifiConnected || gprsConnected) {
onConnected();
return;
}
// 判斷是否是Disconnected事件,注意:處于中間狀態的事件不上報給應用!上報會影響體驗
boolean wifiDisconnected = false;
boolean gprsDisconnected = false;
if (wifiInfo == null || wifiInfo != null
&& wifiInfo.getState() == State.DISCONNECTED) {
wifiDisconnected = true;
}
if (gprsInfo == null || gprsInfo != null
&& gprsInfo.getState() == State.DISCONNECTED) {
gprsDisconnected = true;
}
if (wifiDisconnected && gprsDisconnected) {
onDisconnected();
return;
}
}
protected abstract void onDisconnected();
protected abstract void onConnected();
}
}
來自:http://my.oschina.net/dragonboyorg/blog/160923