本文主要用到了安卓监测网络状态变化功能,实现了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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sc=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}@Overridepublic void onServiceConnected(ComponentName name,  IBinder service) {// TODO Auto-generated method stubreceiveMsgService = ((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

完成

Android实现监测网络状态相关推荐

  1. android控制wifi状态

    wifi的五种状态 常量名 常量值 网卡状态 WIFI_STATE_DISABLED         1            WIFI网卡不可用 WIFI_STATE_DISABLING       ...

  2. Android检查网络状态步骤

    android 如何检查网络连接状态,是android开发中一个常见的问题. 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限: <span style=" ...

  3. android运行时状态,Android 如何保存Android 运行时状态

    Android 如何保存Android 运行时状态 使用 SaveInstanceState去保存运行时数据 首先,我们需要重写一下系统的public void onSaveInstanceState ...

  4. Android 监控网络状态

    Html代码 public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity  ...

  5. //监测网络状态(AFNetworking) 服务端 客户端

    2019独角兽企业重金招聘Python工程师标准>>> //监测网络状态(AFNetworking) #import "ViewController.h" //引 ...

  6. android流量显示插件,[android]仿360状态,种流量监控桌面浮动显示

    [android]仿360状态,类流量监控桌面浮动显示 前两天看到部分音频播放器可以实现在桌面上显示歌词,360那个浮动的桌面提示,想不到怎么实现.然后查了些资料大致了解了下,比想象的简单多了.先看效 ...

  7. Android息屏状态下启动App

    Android息屏状态下启动App 需求简介 分析 1.点亮屏幕 2.通过startActivity方法启动App 启动失败问题 原因 解决 需求简介 设备在息屏的状态下,通过特定的物理按键去启动Ca ...

  8. Android ToggleButton:状态切换的Button

     Android ToggleButton:状态切换的Button Android ToggleButton和Android Button类似,但是ToggleButton提供了一种选择机制,可以 ...

  9. 史上最完美的Android沉浸式状态导航栏攻略

    前言 最近我在小破站开发一款新App,叫高能链.我是一个完美主义者,所以不管对架构还是UI,我都是比较抠细节的,在状态栏和导航栏沉浸式这一块,我还是踩了挺多坑,费了挺多精力的.这次我将我踩坑,适配各机 ...

最新文章

  1. 荒岛余生最后一个包裹_豆瓣评分8.5,一个人撑起整部电影,最后的彩蛋让人无语...
  2. Java注释 link_开源代码中注释中的那些a link p @ 是给什么编辑器用的????
  3. TopCoder入门教程
  4. html 图片变灰,科技常识:css使图片变灰的实现方法
  5. java sublist_Java Vector subList()方法与示例
  6. 设计模式之笔记--简单工厂模式(Simple Factory)
  7. oracle 5表关联查询,Oracle学习笔记5 - 表查询
  8. vb子程序未定义怎么改怎么办_vb中子程序或者函数未定义!求教解决方案,
  9. [国嵌攻略][125][总线设备驱动模型]
  10. 时钟服务器地址_时钟同步 Chrony 教程
  11. js对象写入键值对_41 利用字面量创建对象
  12. 如何解读vmlinux.lds.S文件
  13. java读取gpx文件,读取GPX文件+optpars的简单python脚本
  14. 小程序微信支付errcode:40163问题
  15. wps如何只让他显示3级标题_wps怎么把标题显示出来
  16. 学无止境,京东活动自动领取脚本
  17. 蓝桥杯 灭鼠先锋 博弈
  18. 生活记录:突然“醒来”
  19. oul可以用作c语言常量吗,吉大15秋学期《C语言程序设计》在线作业二 答案
  20. 数据湖与数据仓库的新未来:阿里提出湖仓一体架构

热门文章

  1. PAT乙类1009 说反话 (20 分)
  2. 最全BAT前端开发面试80题:算法+html+js+css!含答案大赠送!
  3. 评测征集 | 2021全国知识图谱与语义计算大会
  4. 论文征集 | 2019 Joint International Semantic Technology Conference
  5. 12.20今日头条实习面试总结-算法工程师
  6. leetcode--数组(Easy)
  7. 【Java】函数式编程思想-Lambda表达式
  8. MyBatis中SQL语句相关内容
  9. 7、JPA-映射-双向一对多
  10. php 文件加载方式