Android网络应用之WI-FI检测

来源:互联网 发布:应届生求职网站知乎 编辑:程序博客网 时间:2024/05/16 08:28

本章主要用于构件应用程序的自动后台检测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;}@Overridepublic 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)方法:

@Overridepublic 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方法如下:

@Overridepublic 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;elseflag = 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说明文档。


0 0
原创粉丝点击