Android网络应用之WI-FI检测

Posted 骨灵冷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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说明文档。


以上是关于Android网络应用之WI-FI检测的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 上检测飞行模式?

Android WebView 缓存

Android性能优化第(八)篇---App启动速度优化之耗时检测处理

反射的基本概念及应用

Android Framework 之 Window / WindowManager基本概念及addView源码分析

Android Framework 之 Window / WindowManager基本概念及addView源码分析