标签:
本章主要用于构件应用程序的自动后台检测Wifi信号的有无。
主要完成的功能是:应用程序在启动使用过程中全程检测wifi信号,当出现wifi信号时会弹出Toast提示,当wifi信号消失也会提示,其他时间状态不变时不提示。
功能比较简单,可是小编是第一次入手Android,就把自己的思路写下来,大神勿喷。
首先,主要思路分为三步:
1)、在onCreate方法中调用时间任务,将时间设置为5秒,即每5秒检测运行一次检测。
2)、当检测到连接时,发送信号,当连接断开时,发送无连接的信号
3)、handler处理,接收message,根据msg.what响应不同的处理,弹出Toast提示。
分类代码如下:
先在Manifest文件中添加访问WIFI的权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
WifiManager wifimanager = (WifiManager) getSystemService(Context.WIFI_SERVICE
接下来创建Timer对象,执行一个时间任务:
Timer timer = new Timer(); timer.schedule(new MyThread(wifimanager), 1000, 5000);这里设置为5s检测一次
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的消息。
@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; }
@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信息可以使用wifiManage.getConnectionInfo得到WifiInfo对象,可以获取Wifi的ID号,IP地址,信号强度等信息,具体可以参考API说明文档。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/sjm19901003/article/details/47025975