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性能优化第(八)篇---App启动速度优化之耗时检测处理