1. 程式人生 > >Android 判斷網路連線狀態--實現微信線上/離線狀態切換

Android 判斷網路連線狀態--實現微信線上/離線狀態切換

先看效果圖,有圖有效果了才有動力(右邊是關閉wifi/3g之後的Title樣子)
首先了解一下網路狀態的判斷方法,網路狀態是一個SystemService,可以通過context.getSystemService(String name)獲取,對應的服務名稱為context.CONNECTIVITY_SERVICE; 獲取網路狀態管理物件

  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可以直接訪問到廣播中的一些變數; 最後,需要新增一些許可權: