Android 判斷網路連線狀態--實現微信線上/離線狀態切換
ConnectivityManager connManger = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
在ConnectivityManger物件中有一些相關的方法
NetworkInfo[] infos = connManger.getAllNetworkInfo(); // 獲取所有的連線物件資訊
NetworkInfo active_info = connManger.getActiveNetworkInfo(); // 獲取可用的連線物件資訊
active_info.isAvailable(); // 可用
active_info.isConnected(); // 已經連線
active_info.isConnectedOrConnecting(); // 已經連線或正在連線
// active_info.getState().CONNECTED;
// active_info.getState().CONNECTING;
也可以指定獲取連線的網路如{3G,WiFi,藍芽等如止圖右邊框} 判斷完網路狀態之後,如果網路沒有開啟當前沒有可用的網路,肯定希望直接開啟網路設定進行網路的配置,看下面的程式碼
Intent mIntent = new Intent("/");
ComponentName component = new ComponentName("com.android.settings", "com.android.settings.WirelessSettings");
mIntent.setComponent(component);
mIntent.setAction("android.intent.action.VIEW");
startActivity(mIntent);
至此對網路狀態的判斷有了瞭解,怎麼實時的監聽網路狀態改變呢,在android中,當網路狀態發生改變的時候會發出一個廣播,我們只需要接收到此廣播即可進行判斷
public static final String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
再看我們的標題,也就是重點,需要在頁面上顯示當前是否線上,也就是需要在接收到網路狀態改變的廣播的時候,要能夠與Activity進行互動,通知Activity當前的網路狀態,讓Activity進行提示通知當前是線上還是離線,這就需要寫一個Service,並且繫結到Activity,把廣播監聽到的實時的網路狀態返回給Activity
public class ReceiveMsgService extends Service {// 實時監聽網路狀態改變
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
Timer timer = new Timer();
timer.schedule(new QunXTask(getApplicationContext()), new Date());
}
}
};public interface GetConnectState {
public void GetState(boolean isConnected); // 網路狀態改變之後,通過此介面的例項通知當前網路的狀態,此介面在Activity中注入例項物件
}
private GetConnectState onGetConnectState;
public void setOnGetConnectState(GetConnectState onGetConnectState) {
this.onGetConnectState = onGetConnectState;
}
private Binder binder = new MyBinder();
private boolean isContected = true;
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {// 註冊廣播
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // 新增接收網路連線狀態改變的Action
registerReceiver(mReceiver, mFilter);
}
class QunXTask extends TimerTask {
private Context context;
public QunXTask(Context context) {
this.context = context;
}
@Override
public void run() {
if (isConnectNet()) {
isContected = true;
} else {
isContected = false;
}
if (onGetConnectState != null) {
onGetConnectState.GetState(isContected); // 通知網路狀態改變
}
}
/**
* 判斷是否連通網路
*
* @return
*/
private boolean isConnectNet() {
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo Mobile = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo Wifi = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (Mobile.getState().equals(State.DISCONNECTED)
&& Wifi.getState().equals(State.DISCONNECTED)) {
return false;
}
return true;
}
}
public class MyBinder extends Binder {
public ReceiveMsgService getService() {
return ReceiveMsgService.this;
}
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver); // 刪除廣播
}
}
接下來在Activity中,繫結服務
private boolean conncetState = true; // 記錄當前連線狀態,因為廣播會接收所有的網路狀態改變wifi/3g等等,所以需要一個標誌記錄當前狀態
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
receiveMsgService = ((MyBinder) service).getService();
receiveMsgService.setOnGetConnectState(new GetConnectState() { // 新增介面例項獲取連線狀態
@Override
public void GetState(boolean isConnected) {
if (conncetState != isConnected) { // 如果當前連線狀態與廣播服務返回的狀態不同才進行通知顯示
conncetState = isConnected;
if (conncetState) {// 已連線
handler.sendEmptyMessage(1);
} else {// 未連線
handler.sendEmptyMessage(2);
}
}
}
});
}
};
在handler中處理連線狀態改變之後的通知
public class QunXHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {case 1:// 已連線
...
break;
case 2:// 未連線
title_tv.setText("群信(離線)");
break;default:
break;
}
}
}
當然也可以直接在Activity中註冊一個廣播,在接收到廣播之後進行判斷,這種情況就稍簡單些,Activity可以直接訪問到廣播中的一些變數; 最後,需要新增一些許可權: