天天看点

Android网络状态监控

Android 监控网络状态 

  在Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化。android的网络状态监听可以用BroadcastReceiver来接收网络状态改变的广 播,具体实现如下:

  当我们要在程序中监听网络状态时,只要一下几个步骤即可:

1、定义Receiver

  定义一个Receiver重载其中的onReceive函数,在其中完成所需要的功能,如根据WIFI和GPRS是否断开来改变空间的外观

1 connectionReceiver = new BroadcastReceiver() {
 2            
 3         @Override
 4         public void onReceive(Context context, Intent intent) {
 5             ConnectivityManager connectMgr = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
 6             NetworkInfo mobNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
 7             NetworkInfo wifiNetInfo = connectMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
 8 
 9             if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
10                 Log.i(TAG, "unconnect");
11                 // unconnect network
12             }else {
13 
14                 // connect network
15             }
16         }
17     };      

2、注册Receiver

  在适当的地方注册Receiver,可以在程序中注册,在onCreate中调用如下函数即可:

1     IntentFilter intentFilter = new IntentFilter();
2     intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
3     context.registerReceiver(connectionReceiver, intentFilter);      

3、注销Receiver

  在适当时注销Receiver,可以在程序中取消,在onDestroye中调用如下函数即可:

1 if (connectionReceiver != null) {
2     unregisterReceiver(connectionReceiver);
3 }      

  Ps:网上还有很多关于使用TelephonyManager 的方法的,方法如下(但是我试了好几次都有问题,如每次第一次进入一个Activity时会自动收到网络断开的信号,每次网络状态改变时收到多次回调且状态不正确。不知道有什么要注意的地方,求指点!)

1 final TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
 2 
 3 mTelephonyMgr.listen(new PhoneStateListener(){ 
 4      @Override
 5      public void onDataConnectionStateChanged(int state) {
 6          switch(state){
 7              case TelephonyManager.DATA_DISCONNECTED://网络断开
 8                  break;
 9              case TelephonyManager.DATA_CONNECTING://网络正在连接
10                  break;
11              case TelephonyManager.DATA_CONNECTED://网络连接上
12                  break;
13          }
14      }
15 }, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);      

   PS中的方法并没有去尝试过。还是第一种比较好用。如果要程序隐藏在后台的话,建议开个service,将BroadcastReceiver注册在service,但不要忘了取消注册。

在测试中遇到过这样的状况,将一个当前连接wifi的路由设备关闭,但是程序并没有捕捉到unconnect network,可能是因为手机设备立刻连接另一个路由设备了。

  因为获取的是服务对象,所以这个网络状态都是时时刷新的,所以我们只需要得到网络状态就可以了!