很多時(shí)候我們都需要實(shí)時(shí)監(jiān)聽網(wǎng)絡(luò)狀態(tài),當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化之后立即通知程序進(jìn)行不同的操作。
監(jiān)聽廣播的兩種方式:
(1)在AndroidManifest.xml配置文件中聲明
<receiver android:name=".NetworkConnectChangedReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>
(2)在代碼中注冊
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectChangedReceiver(), filter);
接下來創(chuàng)建實(shí)時(shí)監(jiān)聽網(wǎng)絡(luò)連接與斷開狀態(tài)變化的BroadcastReceiver對(duì)象,我們需要繼承android.content.BroadcastReceiver,并實(shí)現(xiàn)其onReceive方法,下面我們就創(chuàng)建一個(gè)名為NetworkConnectChangedReceiver廣播接收者,看一下具體的實(shí)現(xiàn)代碼,由于代碼寫得很詳細(xì),就不一一解釋了
package com.per.networkconnectdome;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Parcelable;
import android.util.Log;
public class NetworkConnectChangedReceiver extends BroadcastReceiver {
private String getConnectionType(int type) {
String connType = "";
if (type == ConnectivityManager.TYPE_MOBILE) {
connType = "3G網(wǎng)絡(luò)數(shù)據(jù)";
} else if (type == ConnectivityManager.TYPE_WIFI) {
connType = "WIFI網(wǎng)絡(luò)";
}
return connType;
}
@Override
public void onReceive(Context context, Intent intent) {
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {// 監(jiān)聽wifi的打開與關(guān)閉,與wifi的連接無關(guān)
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
Log.e("TAG", "wifiState:" + wifiState);
switch (wifiState) {
case WifiManager.WIFI_STATE_DISABLED:
break;
case WifiManager.WIFI_STATE_DISABLING:
break;
}
}
// 監(jiān)聽wifi的連接狀態(tài)即是否連上了一個(gè)有效無線路由
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
Parcelable parcelableExtra = intent
.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (null != parcelableExtra) {
// 獲取聯(lián)網(wǎng)狀態(tài)的NetWorkInfo對(duì)象
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra;
//獲取的State對(duì)象則代表著連接成功與否等狀態(tài)
NetworkInfo.State state = networkInfo.getState();
//判斷網(wǎng)絡(luò)是否已經(jīng)連接
boolean isConnected = state == NetworkInfo.State.CONNECTED;
Log.e("TAG", "isConnected:" + isConnected);
if (isConnected) {
} else {
}
}
}
// 監(jiān)聽網(wǎng)絡(luò)連接,包括wifi和移動(dòng)數(shù)據(jù)的打開和關(guān)閉,以及連接上可用的連接都會(huì)接到監(jiān)聽
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
//獲取聯(lián)網(wǎng)狀態(tài)的NetworkInfo對(duì)象
NetworkInfo info = intent
.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if (info != null) {
//如果當(dāng)前的網(wǎng)絡(luò)連接成功并且網(wǎng)絡(luò)連接可用
if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) {
if (info.getType() == ConnectivityManager.TYPE_WIFI
|| info.getType() == ConnectivityManager.TYPE_MOBILE) {
Log.i("TAG", getConnectionType(info.getType()) + "連上");
}
} else {
Log.i("TAG", getConnectionType(info.getType()) + "斷開");
}
}
}
}
}
在onReceive方法里面,我們可以獲取從廣播而來的Intent中的數(shù)據(jù),這包含很多有用的信息,其中
ConnectivityManager : 主要管理和網(wǎng)絡(luò)連接相關(guān)的操作
WifiManager: 管理和wifi相關(guān)的信息
TelephonyManager: 管理和手機(jī)、運(yùn)營商等的相關(guān)信息
NetworkInfo類包含了對(duì)wifi和mobile兩種網(wǎng)絡(luò)模式連接的詳細(xì)描述,通過getState()方法獲取的State對(duì)象,代表著連接成功與否的狀態(tài)。
最后記得添加權(quán)限:
<uses-permission android:name="android.permission.access_wifi_state" />
<uses-permission android:name="android.permission.access_network_state" />