獲取網絡連接狀態
ConnectivityManager可以獲取Android系統的網絡連接相關信息,它是系統服務中的一員:
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
得到管理器對象後,調用getActiveNetworkInfo()即可獲得當前活動的網絡連接信息了,若無網絡訪問,返回NULL
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
根據getType()返回的值來判斷是哪一種網絡連接類型,一般來說,我們只要判斷有無、是否是WIFI就行了
int state = NETWORK_NULL;
if(mNetworkInfo != null){
switch (mNetworkInfo.getType()){
case -1:
state = NETWORK_NULL;
break;
case ConnectivityManager.TYPE_MOBILE:
state = NETWORK_MOBILE;
break;
case ConnectivityManager.TYPE_WIFI:
state = NETWORK_WIFI;
break;
default:
state = NETWORK_OTHER;
break;
}
}
監聽網絡連接變更
網絡連接變更時,系統會發送一條廣播,自定義一個廣播接收者來監聽這個廣播,我們就可以隨時監聽網絡變更事件
該廣播爲:"android.net.conn.CONNECTIVITY_CHANGE"
它是ConnectivityManager的常量:ConnectivityManager.CONNECTIVITY_ACTION
代碼如下:
/**
* 監聽網絡狀態的接收者
* <p>
* 需要權限:
* <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
* <p>
* 需要註冊過濾器:
* <p>
* <intent-filter>
* <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
* </intent-filter>
*/
public class NetworkStateBroadcastReceiver
extends BroadcastReceiver {
public enum State {
/** 沒有網絡 */
NULL,
/** 手機3G、GPRS網絡 */
MOBILE,
/** WIFI網絡 */
WIFI,
/** 其它網絡連接(如藍牙) */
OTHER
}
/** 當前的網絡狀態 */
private static State sState;
/** 監聽網絡狀態的對象集合,使用了弱引用持有對象,當回調時,纔會清除已釋放的弱引用對象 */
private static final LinkedList<NetworkStateListener> mListeners = new LinkedList<>();
static {
//獲取網絡連接管理器
ConnectivityManager mConnectivityManager =
(ConnectivityManager) ApplicationHolder.instance().getSystemService(Context.CONNECTIVITY_SERVICE);
//當前的網絡連接信息
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
//判斷當前的網絡狀態
State s = State.NULL;
if (mNetworkInfo != null) {
switch (mNetworkInfo.getType()) {
case -1:
s = State.NULL;
break;
case ConnectivityManager.TYPE_MOBILE:
s = State.MOBILE;
break;
case ConnectivityManager.TYPE_WIFI:
s = State.WIFI;
break;
default:
s = State.OTHER;
break;
}
}
sState = s;
}
@Override
public void onReceive(Context context, Intent intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
//獲取當前網絡狀態
int networkType = intent.getIntExtra("networkType", -1);
State s;
switch (networkType) {
case -1:
s = State.NULL;
break;
case ConnectivityManager.TYPE_MOBILE:
s = State.MOBILE;
break;
case ConnectivityManager.TYPE_WIFI:
s = State.WIFI;
break;
default:
s = State.OTHER;
break;
}
if (s != sState) {
//將結果回調給監聽者
sState = s;
doCallBack(sState);
}
}
}
/** 網絡狀態變化時,回調接口 */
private static synchronized void doCallBack(State state) {
for (NetworkStateListener listener : mListeners) {
listener.onNetworkStateChanged(state);
}
}
/** 添加網絡狀態變化的監聽者 */
public static synchronized void addListener(@NonNull NetworkStateListener listener) {
mListeners.add(listener);
}
/** 添加網絡狀態變化的監聽者,並進行一次初始化的回調 */
public static synchronized void addListenerWithInitCall(@NonNull NetworkStateListener listener) {
mListeners.add(listener);
listener.onNetworkStateChanged(sState);
}
/** 移除網絡狀態變化的監聽者 */
public static synchronized boolean removeListener(@NonNull NetworkStateListener listener) {
return mListeners.remove(listener);
}
/** 監聽網絡狀態變化的接口 */
public interface NetworkStateListener {
void onNetworkStateChanged(State state);
}
/** 獲取當前狀態 */
public static State getState() {
return sState;
}
/** 是否有網絡 */
public static boolean hasNetwork() {
return sState != State.NULL;
}
/** 是否有WIFI連接 */
public static boolean hasWifi() {
return sState == State.WIFI;
}
}
對外開放了幾個靜態方法來獲取當前的網絡狀態及監聽網絡狀態變化。
addListener添加監聽者時,爲避免內存泄漏,應在Activity的onDestory階段調用removeListener移除監聽者。