Android实现监测网络状态

本文主要用到了安卓监测网络状态变化功能,实现了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

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jni 步骤

这是我转的文章,是篇外文翻译,将介绍如何学习安装 Android NDK 并开始使用它。在这一教程结束后,将创建你自己的项目,从 Java 代码简单地调用原生C 语言代码。教程细节技术:Android SDK、NDK、C 语言难度:进…

德勤:2025年汽车行业价值链的四个合理情境

来源:亿欧摘要:近日,德勤发布《未来汽车行业价值链:2025年以后》,假设在大部分整车企业都有变革意愿的情境下,识别出四个2025年整车企业价值链可能具有的合理设定。随着自动驾驶、共享经济等新技术以及新商…

盘点英特尔、苹果、高通、AMD 处理器重大 Bug,硬件的坑软件能填?

来源:21ic电子网英特尔的CPU存在两大漏洞 ——Meltdown 和 Spectre,波及自 1995 年以来所有使用英特尔芯片的硬件设备。不止 Linux、Android、Windows、苹果 OS X 等操作系统,AWS、Azure、谷歌云等云计算提供商均受到影响,其威胁范…

java读写html文件时出现中文乱码问题的解决方法

最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。然后,替换相关标签写到指定的文件中。无论是读写,都遇到了中文乱码问题。试过多种方法,发现下面一种可以避免中文乱码。(无论读取还是写入一定要进行编码转…

Android实现网络音乐播放器

本文是一个简单的音乐播放器 布局代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layo…

【干货51页PPT】深度学习理论理解探索

来源&#xff1a;专知普林斯顿大学计算机科学系教授Sanjeev Arora做了深度学习理论理解探索的报告&#xff0c;包括三个部分&#xff1a;Why overparametrization and or overprovisioning?Optimization in deep learningTheory for Generative Models and Generative Adversa…

新星计划·第三季【博文流量密码公开课】

一、优质的内容 刚开始写博客的小伙伴&#xff0c;其不可漫无目的的写&#xff0c;到头来对自己的技术沉淀毫无帮助&#xff0c;升职加薪跳槽也不加分&#xff0c;更无法通过付费专栏等方式进行变现&#xff0c;到头来一无所获&#xff01; 强烈建议大家提前规划写什么方向的…

百度地图开发之定位

本文主要讲述利用百度地图API实现定位功能 第一步:下载SDK与申请KEY 参考链接&#xff1a;Android 百度地图 SDK v3.0.0 &#xff08;一&#xff09; - Hongyang - 博客频道 - CSDN.NET 注意 百度地图SDK与百度定位SDK已经分开了&#xff0c;如果在工程中同时导入这两个包…

Java与Http协议

Java与Http协议 引言 http&#xff08;超文本传输协议&#xff09;是一个基于请求与响应模式的、无状态的、应用层的协议&#xff0c;常基于TCP的连接方式。HTTP协议的主要特点是&#xff1a; 1.支持客户/服务器模式。 2.简…

《Python 黑科技》一键分析评论关键词,制作精美词云

本文重点&#xff1a; 学会抓取文章评论 学会文本分词、制作词云 目录 &#x1f351; 一、抓取全部评论 &#x1f35e; 1、找到评论接口 &#x1f34f; 2、Python 获取评论 &#x1f3c8; 二、文本分词、词云制作 &#x1f34b; 1、文本分析 &#x1f350; 2、生成词云…

PANS最新脑神经科学研究:激活一种新语言并不费力气

来源&#xff1a;中国生物技术网美国纽约大学的一项新研究发现&#xff0c;我们在不同语言之间切换时的大脑工作模式&#xff0c;这使我们对双语现象有了新的理解。纽约大学博士生Esti Blanco-Elorrieta是这项研究的第一作者&#xff0c;他解释说&#xff1a;“多语言能力者的一…

百度地图之添加覆盖物

本文主要讲解如何实现在百度地图上添加覆盖物 1.承载数据的实体 我们从服务器返回的数据部分&#xff0c;最终可能是个Json数组&#xff0c;我们需要转换为实体集合&#xff0c;即下面的Info.java 我直接在实体类中声明了一个静态列表集合&#xff0c;模拟从服务器返回的数据…

能力认证计划 -- 名企内推保 offer 直通车

CSDN 能力认证的目的&#xff1a;清晰定义工程师能力模型&#xff0c;面向开发者、技术爱好者、在校大学生等群体&#xff0c;通过机试&#xff08;真人露脸、全程录屏、限时提交&#xff09;测出应试者的真能力&#xff0c;筛选合格软件人才&#xff0c;建立应聘者与企业之间的…

fprintf 和 perror 的理解1

程序中的两种出错处理&#xff1a; 第一种: 用fprintf 2: #include <string.h> 3: #include <errno.h> 4: #include <stdlib.h> 5: 1: #include <stdio.h> 6: int main(void) 7: { 8: FILE *fp; 9: 10: if((fp fopen("1.c…

全文!《2018中国IoT报告》!

来源&#xff1a;5G9月15-18日&#xff0c;我国物联网领域规格最高、规模最大的国家级博览会——2018世界物联网博览会将在无锡举行。作为2018世界物联网博览会的重要活动之一&#xff0c;9月14日受大会组委会委托&#xff0c;中国经济信息社在无锡发布《2017-2018年中国物联网…

CSDN客户端实现

本文主要讲解实现了一个CSDN的安卓客户端&#xff0c;主要知识点如下 java爬虫获取网页数据 将java程序打包成jar包 FragmentviewpagerTabPageIndicator实现Tab效果 gestureImageView实现放大缩小图片imageLodar实现异步加载图上 XListView实现下拉刷新 java爬虫获取网页资源…

抓住金三银四的尾巴,解锁程序员面试《刷题神器》

点赞 ➕ 评论 ➕ 收藏 三连再看你最帅 刷题 不仅能掌握知识&#xff0c;快速学习进步。 更能轻松搞定面试&#xff0c;尤其是有的大厂 钟爱问算法题&#xff0c;你不刷就不会&#xff0c;就会被pass。同时&#xff0c;刷题能陶冶情操&#xff0c;避免老年痴呆 &#x1f60b; …

腾讯AI Lab开源世界首款自动化模型压缩框架PocketFlow:将深度学习装进口袋

来源&#xff1a;腾讯AI 实验室腾讯AI Lab机器学习中心今日宣布成功研发出世界上首款自动化深度学习模型压缩框架——PocketFlow&#xff0c;并即将在近期发布开源代码。这是一款面向移动端AI开发者的自动模型压缩框架&#xff0c;集成了当前主流&#xff08;包括腾讯AI Lab自研…

【拿走不谢】大数据高效查询神器--bitmap

背景 在hive中使用Roaring64Bitmap实现精确去重功能 主要目的&#xff1a; 提升 hive 中精确去重性能&#xff0c;代替hive 中的 count(distinct uuid)&#xff1b;节省 hive 存储 &#xff0c;使用 bitmap 对数据压缩 &#xff0c;减少了存储成本&#xff1b;提供在 hive 中…

Android之智能问答机器人

本文主要利用图灵机器人的接口&#xff0c;所做的一个简单的智能问答机器人 实现 由于发送与接收消息都是不同的listView&#xff0c;所以要用有两个listVeiw的布局文件 接收消息布局文件 <?xml version"1.0" encoding"utf-8"?> <LinearLa…