Android 利用BroadcastReceiver實時檢測網絡狀態變化

一、定義ReceiveService類

當接收到的網絡狀態發生改變時通知Activity,需要一個Service,並且綁定該到Activity。

import 

java.util.Date;import java.util.Timer;import java.util.TimerTask;import android.app.Service;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.os.Binder;import android.os.IBinder;import android.util.Log;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 NetworkTask(getApplicationContext()), new Date()); } } }; public interface GetConnectState { void GetState(boolean isConnected); // 網絡狀態改變之後,通過此接口的實例通知當前網絡的狀態,此接口在Activity中注入實例對象 } private GetConnectState onGetConnectState; public void setOnGetConnectState(GetConnectState onGetConnectState) { this.onGetConnectState = onGetConnectState; } private Binder binder = new MyBinder(); private boolean isConnected = 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 NetworkTask extends TimerTask { private Context context; public NetworkTask(Context context) { this.context = context; } @Override public void run() { if (isNetworkConnected(context)) { isConnected = true; } else { isConnected = false; } if (onGetConnectState != null) { onGetConnectState.GetState(isConnected); // 通知網絡狀態改變 } } /* * 判斷是否有網絡連接 */ private boolean isNetworkConnected(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { return false; } else { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) { for (NetworkInfo net : info) { if (net.getState() == NetworkInfo.State.CONNECTED) { return true; } } } } return false; } } public class MyBinder extends Binder { public ReceiveMsgService getService() { return ReceiveMsgService.this; } } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); // 刪除廣播 }} 

二、接下來在Activity中,綁定服務

注意:在TabActivity的子Activity中使用service時,bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE),需要改爲:

            this.getApplicationContext().bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE) ,纔可正常使用。

public class MainActivity extends Activity  {        ReceiveMsgService receiveMsgService;      private boolean conncetState = true// 記錄當前連接狀態 
      @Override      protected void onCreate(Bundle savedInstanceState) {          // TODO Auto-generated method stub          super.onCreate(savedInstanceState);          setContentView(R.layout.page_main);     
        bind();      }        private void bind() {          Intent intent = new Intent(MainActivity.this, ReceiveMsgService.class);          bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);      }        private ServiceConnection serviceConnection = new ServiceConnection() {          @Override          public void onServiceDisconnected(ComponentName name) {          }            @Override          public void onServiceConnected(ComponentName name, IBinder service) {              receiveMsgService = ((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);                                  }                              }                          }                      });          }      };            private void unbind() {          if (receiveMsgService != null ) {              unbindService(serviceConnection);          }      }        Handler handler = new Handler() {          public void handleMessage(Message msg) {                switch (msg.what) {              case 1:// 已連接                  Toast.makeText(MainActivity.this"網絡已經連接" ,Toast.LENGTH_LONG).show();                  break;              case 2:// 未連接                  Toast.makeText(MainActivity.this"網絡未連接" ,Toast.LENGTH_LONG).show();                  break;              default:                  break;              }              ;          };        };            @Override      protected void onDestroy()      {          // TODO Auto-generated method stub          super.onDestroy();          unbind();      }   

三、在Manifest中註冊Serevice和相關權限

<usespermission android:name="android.permission.ACCESS_NETWORK_STATE" />   
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
//註冊service
<service android:enabled="true" android:name=".ReceiveMsgService" />

發佈了14 篇原創文章 · 獲贊 35 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章