Android实现监测网络状态

来源:互联网 发布:中国医院协会网络培训 编辑:程序博客网 时间:2024/06/06 12:22

本文主要用到了安卓监测网络状态变化功能,实现了WIFI,3G,无网络状态切换时发出通知的功能。

主要知识点

  1. service
  2. broadcast
  3. 接口回调实现

service的基本知识

service可分为

  • 按运行地点分类

    • 本地服务
    • 远程服务
  • 按按运行类型分类:

    • 前台服务
    • 后台服务
  • 按使用方式分类:

    • startService 启动的服务
    • bindService 启动的服务
    • startService 同时也 bindService 启动的服务

service生命周期

这里写图片描述

详情请见参考链接:

Android 中的 Service 全面总结 - - 博客频道 - CSDN.NET

Android开发之如何保证Service不被杀掉(broadcast+system/app) - 其实并不难,是你太悲观 - 博客频道 - CSDN.NET

安卓监测网络状态变化

service部分

package com.zj.servicewifi;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.provider.SyncStateContract.Constants;import android.util.Log;public class WIFIService extends Service{    int IntentId;    int NOINTENT=0;    int WIFI=1;    int GRS=2;    // 实时监听网络状态改变      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(int 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 (is3GConnected(context)&&isWifiConnected(context)==false)              {                  System.out.println("hereere*************");                IntentId= 2;            }             else if(isWifiConnected(context))            {                IntentId=WIFI;            }            else              {                 IntentId=NOINTENT;            }              if (onGetConnectState != null)              {                  onGetConnectState.GetState(IntentId); // 通知网络状态改变                  Log.i("mylog", "通知网络状态改变:" + IntentId);              }          }          /*          * 判断是3G否有网络连接          */          private boolean is3GConnected(Context context)          {              if (context != null)              {                  ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);                  NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();                if (mNetworkInfo != null)                  {                      return mNetworkInfo.isAvailable();                  }              }              return false;          }          /*          * 判断是否有wifi连接          */          private boolean isWifiConnected(Context context)          {              if (context != null)              {                  ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);                  NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);                  if (mWiFiNetworkInfo != null)                  {                      return mWiFiNetworkInfo.isAvailable();                  }              }              return false;          }      }      public class MyBinder extends Binder      {          public WIFIService getService()          {              return WIFIService.this;          }      }      @Override      public void onDestroy()      {          super.onDestroy();          unregisterReceiver(mReceiver); // 删除广播      }  }

注意,其中用到广播接收者,广播接收者有两种注册方式,在代码中注册与在XML文件中注册,本例中在代码中注册了,如果再在XML中注册,会报错

activity中代码

package com.zj.servicewifi;import com.zj.servicewifi.WIFIService.GetConnectState;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {    protected String TAG = "mylog";      WIFIService receiveMsgService;      int IntentID=0;    ServiceConnection sc;   boolean state;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sc=new ServiceConnection() {            @Override            public void onServiceDisconnected(ComponentName name) {                // TODO Auto-generated method stub            }            @Override            public void onServiceConnected(ComponentName name,  IBinder service) {                // TODO Auto-generated method stub                            receiveMsgService = ((WIFIService.MyBinder) service)                                      .getService();                              receiveMsgService.setOnGetConnectState(new GetConnectState() { // 添加接口实例获取连接状态                                          @Override                                          public void GetState(int id) {                                              if (IntentID != id) { // 如果当前连接状态与广播服务返回的状态不同才进行通知显示                                                  IntentID = id;                                                  if (IntentID==0) {// 已连接                                                      handler.sendEmptyMessage(0);                                                  } else if(IntentID==1){// 未连接                                                      handler.sendEmptyMessage(1);                                                  }  else if(IntentID==2)                                                {                                                    handler.sendEmptyMessage(2);                                                }                                            }                                          }                                      });            }        };    }    public void bind(View view)    {        startService(new Intent(MainActivity.this,WIFIService.class));        bindService(new Intent(MainActivity.this, WIFIService.class), sc, getApplicationContext().BIND_AUTO_CREATE);        state = true;    }    public void unbind(View view)    {        if(state ){            unbindService(sc);            state = false;        }    }    public void start(View view)    {    }    public void stop(View view)    {    }    @Override      protected void onDestroy()      {          // TODO Auto-generated method stub          super.onDestroy();          if(state){            unbindService(sc);            state = false;        }     }        Handler handler = new Handler() {              public void handleMessage(Message msg) {                  switch (msg.what) {                  case 0:                    Toast.makeText(MainActivity.this, "网络未经连接" ,Toast.LENGTH_LONG).show();                     break;                case 1:// 已连接                      Toast.makeText(MainActivity.this, "WIFI已经连接" ,Toast.LENGTH_LONG).show();                      break;                  case 2:// 未连接                      Toast.makeText(MainActivity.this, "3G已连接" ,Toast.LENGTH_LONG).show();                      break;                  default:                      break;                  }                  ;              };          };  }

本例中最重要的一点就是在service中定义了一个接口,在activity中实例化,则在service中调用方法的时候,会调用在activity中实例化的方法,不知道这是什么设计模式,只觉得很神奇。

参考链接:

android 通过Service和Receiver来监听网络状态 - - ITeye技术网站

Android判断设备网络连接状态,并判断连接方式 - lzan13的专栏 - 博客频道 - CSDN.NET

完成

0 0