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说明文档。
- Android网络应用之WI-FI检测
- android Wi-Fi集成之分析
- Android Wi-Fi Peer-to-Peer(Android的Wi-Fi P2P对等网络)
- ANdroid Wi-Fi 移植
- Android Wi-Fi源码分析之WifiService操作Wi-Fi(二):WifiStateMachine.java中的SUP_CONNECTION_EVENT分析
- Android 通过 JNI 获取 Wi-Fi 网络接口名
- android 获取网络状态 判断Wi-Fi 3G
- Android Wi-Fi 通过wpa_cli 命令连接到网络过程
- Wi-Fi技术改变应用
- Android学习笔记之WI-FI(1)
- android官方文档之路--Wi-Fi Peer-to-Peer
- Android Wi-Fi源码分析之wpa_supplicant初始化(一)
- android官方文档之路--Wi-Fi Peer-to-Peer
- Android Wi-Fi工作原理
- Android Wi-Fi Direct 开发
- Android Wi-Fi工作原理
- Android Wi-Fi工作原理
- Android Wi-Fi基本操作
- NSCoding简单写法
- flask接受jquery ajax传递过来的参数
- HDU 2046 骨牌铺方格
- Fragment(三) Android Fragment应用实战,使用碎片向ActivityGroup说再见
- 最大的数
- Android网络应用之WI-FI检测
- pat 1019. General Palindromic Number (20)
- No result defined for action and result success
- 自定义Toast
- 浮点数转换成人民币读法字符串
- mysql 创建表字段Double类型长度
- 实现一个脚本引擎
- 使用的android 第三方库
- C语言中,头文件和源文件的关系