Android网络应用之WI-FI检测

本章主要用于构件应用程序的自动后台检测Wifi信号的有无。

主要完成的功能是:应用程序在启动使用过程中全程检测wifi信号,当出现wifi信号时会弹出Toast提示,当wifi信号消失也会提示,其他时间状态不变时不提示。

功能比较简单,可是小编是第一次入手Android,就把自己的思路写下来,大神勿喷。

首先,主要思路分为三步:

1)、在onCreate方法中调用时间任务,将时间设置为5秒,即每5秒检测运行一次检测。

2)、当检测到连接时,发送信号,当连接断开时,发送无连接的信号

3)、handler处理,接收message,根据msg.what响应不同的处理,弹出Toast提示。

分类代码如下:

OnCreate中:

先在Manifest文件中添加访问WIFI的权限

	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

接着在onCreate里构建WifiManger对象:

WifiManager wifimanager = (WifiManager) getSystemService(Context.WIFI_SERVICE

接下来创建Timer对象,执行一个时间任务:

		Timer timer = new Timer();
		timer.schedule(new MyThread(wifimanager), 1000, 5000);

这里设置为5s检测一次

构建MyThread类:

	private class MyThread extends TimerTask {
		private boolean conn;
		private WifiManager manager;
		public MyThread(WifiManager _manager){
			this.manager = _manager;
		}
		@Override
		public void run() {
			conn = this.manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED;
			if (conn) {
				Message msg = new Message();
				msg.what = 1;
				myhandler.sendMessage(msg);
			}
		       else
		       {
				Message msg = new Message();
				msg.what = 0;
				myhandler.sendMessage(msg);
		       }
		}
	}

MyThread的功能是每隔5秒执行一次,然后在运行中获取wifi的状态,如果是连接状态,则发送what为1的消息;如果是未连接的状态,则发送what为0的消息。

执行Handler.handleMessage(Message msg)方法:

@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
        showAlertTrue();
        break;
case 0:
	showAlertFalse();
default:
	break;
	}
}

showAlertTrue()和showAlertFalse()功能就是执行Toast,就不贴出来了。

写完代码之后运行,确实显示出了提示消息,但是有一个不好的地方,就是应用程序执行期间每隔5秒就弹出Toast提示,有损用户体验,我们的需求是发送状态改变的时候才出现提示。

所以改变思路,想办法获取状态改变的信息:

这里我的想法是创建两个int类型的对象,记为historyState和currentState,这两个int变量分别用来表示当前和之前的wifi连接状态。

两个变量都有三个值,-1表示无状态,1表示连接状态,0表示断开状态。(-1主要是为了给historyState,因为第一次运行之前是没有连接或者断开这个概念的)

当currentState - historyState = 0时,表示前后两个状态没有发送消息,此时定义的flag变量为-1,表示没有变化

当currentState - historyState = 1时,表示状态由断开到连接,此时flag变量为1,表示产生了连接。

当currentState - historyStae = -1时,表示状态由连接到断开,此时flag变量为0,表示产生了断开。

创建一个函数,来获取currentStae:

public int getCurrentState()
{
	return this.manager.getWifiState() == WifiManager.WIFI_STATE_ENABLED ? 1:0;
}

紧接着我们修改MyThread的run方法如下:

@Override
public void run() {
	if (historyState == -1) {
	currentState = getCurrentState();
	if (currentState == 1) {
	   <span style="white-space:pre">	</span>flag = 1;//表示变化,产生连接变化
	}
	else
	{
		flag = 0;//发生断开变化
	}
	<span style="white-space:pre">	</span>historyState = currentState;
        }
	else
	{
		currentState = getCurrentState();
		int result = currentState - historyState;
		if (result == 0)
			flag = -1;
		else if (result > 0)
				flag = 1;
		else
				flag = 0;
		historyState = currentState;
	}
	if (flag == 1) {
		Message msg = new Message();
		msg.what = 1;
		myhandler.sendMessage(msg);
	}
	else if(flag == 0)
	{
		Message msg = new Message();
		msg.what = 0;
	}
}

这样就完成了状态交换的提示实现。

Wifi的编程可以使用WifiMangager对象从系统服务中获得,每次运行都要检测当前的系统服务状态,获取是否为WIFI-STATE-ENABLED。

要获取其他的wifi信息可以使用wifiManage.getConnectionInfo得到WifiInfo对象,可以获取Wifi的ID号,IP地址,信号强度等信息,具体可以参考API说明文档。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-07 11:22:37

Android网络应用之WI-FI检测的相关文章

android网络应用开发完全解析

??Android网络应用开发,主要有两种方式,一种是socket(是对tcp/udp协议的封装),另外一种就是使用Http协议,Android中主要提供了两种方式,HttpURLConnection和Apache HttpClient.下面对Android网络应用开发进行具体的阐述. 一.基于socket的网络通信 1.基于udp的socket编程步骤 定义码头 即:定义一个DatagramSocket对象ds 定义可以用来接收或者发送数据的集装箱 即:定义DatagramPacket对象dp

【Android】应用程序安全性检测软件1.背景知识搜集

拨号拦截 当用户拨出一个号码时,系统会发出一条广播:android.intent.action.NEW_OUTGOING_CALL 我们通过继承BroadcastReceiver 实现拨出电话的广播接收器OutgoingCallReceiver,使它只响应拨出电话的广播.接收到广播后先获取用户呼叫的号码,然后判断号码的类型,若为开启Policy Manager 设置界面的指令,则启动Policy Manager --基于Android的手机隐私保护技术及实现 ? 1)对于系统Framework

Android设备信息、感应器检测

近日产品已经上线,开始有时间来做自己的事情,于是就开始学习和巩固一些以前用过的或者学过的技术.昨天写了一个检测Android设备的序列号和IMEI以及感应器等等的一个Demo来跟大家分享一下. 在开发中经常要对设备进行识别和唯一标识.我们用到了安卓设备的序列号和设备的MAC号. 一.首先是获取设备的序列号,在开发的时候我们可以这样来获得. String serialName = android.os.Build.SERIAL; 也可以用下面的一个方法来获取设备的序列号 public static

基于Android Studio的内存泄漏检测与解决全攻略

自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclipse,成为主流的Android开发IDE.Android Studio在为我们提供了良好的编码体验的同时,也提供了许多对App性能分析的工具,让开发者可以更方便分析App性能.Google在IO大会上一直告诫开发者不要无节制的使用手机内存,要注意一些不良的开发习惯会导致App的内存泄漏.虽然如今网上

delphiXE7关于android API的使用和检测WIFI状态的问题

在大富翁论坛上有一篇介绍delphi xe5下获取网络状态的文章并附带了一个Androidapi.JNI.Network.pas单元,我使用到XE7下,编译后点击按钮就出来一个错误对话框什么10027什么的,开始我以为是不通用那,我就利用 爱吃猪头肉 QQ: 1444386932 提供的jar转换工具转换了安卓jar包中的文件,正常运行后还是提示错误,后来发现是原来delphi编译器没有设置安卓的权限,可是这也让我稍微学习到一点,只要将安卓的jar文件转换下能让delphi调用,应该是所有的ap

Android开发过程中内存泄露检测

转自 http://blog.csdn.net/shimiso/article/details/44677041 一.内存泄露 内存泄漏会因为减少可用内存的数量从而降低计算机的性能.最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃. 内存泄漏可能不严重,甚至能够被常规的手段检测出来.在现代操作系统中,一个应用程序使用的常规内存在程序终止时被释放.这表示一个短暂运行的应用程序中的内存泄漏不会导致严重后果. 在以下情况,内存泄漏导致较严重的后果: 1)程

Android内存优化9 内存检测工具3 MAT比Menmery Monitor更强大

在Android性能优化第(一)篇---基本概念中讲了JAVA的四大引用,讲了一下GCRoot,第二篇Memory Monitor检测内存泄露仅仅说了Menmery Monitor的使用,这篇博客谈一下MAT来寻找内存泄露,相对来说,Memory Monitor没有MAT强大,但是在开始介绍MAT之前,上两篇没有说清楚的问题先说一下. GC回收对可回收对象的判定什么样的对象是可以被回收的?当然是GC发现通过任何referencechain(引用链)无法访问某个对象的时候,该对象即被回收.名词GC

Android 网络应用--Apache HttpClient的使用

使用HttpClient发送请求,接收响应很简单,只要5步: 创建HttpClient 对象 创建HttpGet对象:或者是HttpPost 对象 如果需要发送请求参数,可以调用HttpGet HttpPost共同的setParams(HttpParams params) 方法来添加请求参数:对于HttpPost对象,也可以调用setEntity(HttpEntity entity)方法来设置请求参数 客户端条件参数: List<NameValuePair> params = new     

Atitit.android js 的键盘按键检测Back键Home键和Menu键事件

1. onKeyDown @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // 在这里做你想做的事情 // super.openOptionsMenu();  // 调用这个,就可以弹出菜单 webView.loadUrl("javascript:KEYCODE_MENU_handle()"); } return true;