Android入门——多线程的使用之实时监测查看Wi-Fi信息及Wi-Fi相关的操作总结

引言

在移动互联的今天,没有哪一款app是可以离开Wi-Fi的,所以这一部分的知识虽然简单但也是不可或缺的,正巧我们智能硬件连接同一网段多个相同UUID的AP时,出现了网络不稳定的情况,为了找到根源(主要是硬件方面说是软件的原因,我肯定要拿出证据),于是就编写了个检测小程序,实时查看Wi-Fi信息,当连接到信号很弱的AP实时,自动断开再连。

一、WifiManager和WifiInfo

WifiManager这个类正如它的名字的含义一样,封装了用于管理Wi-Fi连接的所有方面的主要API,使用之前得先获取WifiManager实例,只有一种途径那就是context.getSystemService(Context.WIFI_SERVICE)——应仅从应用程序上下文获取,而不是从任何其他派生上下文获取,以避免调用进程中的内存泄漏。而WifiInfo就是一个实现了Parcelable接口用于描述Wi-Fi状态信息的Bean,可以通过wifiManager.getConnectionInfo()获得。

1、获取WifiManager实例和获取WifiInfo实例


private WifiAdmin(Context context) {
    //获取系统Wifi服务WIFI_SERVICE
    WifiManager wifiManager  = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    //获取连接信息
    WifiInf wifiInfo = wifiManager.getConnectionInfo();
}

2、判断是否存在指定的热点(根据热点名称)

  /**
    * 是否存在网络信息
    * @param str 热点名称
    * @return
    */
   private WifiConfiguration isExsits(String str) {
       Iterator localIterator = this.wifiManager.getConfiguredNetworks().iterator();
       WifiConfiguration localWifiConfiguration;
       do {
           if (!localIterator.hasNext()){ 
            return null;
           }
           localWifiConfiguration = (WifiConfiguration) localIterator.next();
       } while (!localWifiConfiguration.SSID.equals("\"" + str + "\""));
       return localWifiConfiguration;
   }

3、WifiManager.WifiLock

所谓WifiLock其实可以理解成一种机制,我们知道在手机屏幕关闭之后,并且其他的应用程序没有在使用wifi的时候,android系统大概在两分钟之后,会关闭wifi,使得wifi处于睡眠状态,来节省电源能量和延长电池寿命等。但是有时候我们希望Wi-Fi一直处于活跃状态,于是Android提供了一种叫WifiLock的机制,能够阻止wifi进入睡眠状态。

  • 创建WifiManager.WifiLock
    /** 
     *  
     * @param lockName 
     * 锁的名字 
     * @return wifiLock 
     */  
    public WifiLock createWifiLock(String lockName) {  
        wifiLock = wifiManager.createWifiLock(lockName);  
        return wifiLock;  
    }  

/** 
     *  
     * @param lockName 
     *            锁的名称 
     * @param lockType 
     *  
     *            WIFI_MODE_FULL == 1 <br/> 
     *            扫描,自动的尝试去连接一个曾经配置过的点<br /> 
     *            WIFI_MODE_SCAN_ONLY == 2 <br/> 
     *            只剩下扫描<br /> 
     *            WIFI_MODE_FULL_HIGH_PERF = 3 <br/> 
     *            在第一种模式的基础上,保持最佳性能<br /> 
     * @return wifiLock 
     */  
    public WifiLock createWifiLock(String lockName, int lockType){  
        wifiLock = wifiManager.createWifiLock(lockType, lockName);  
        return wifiLock;  
    } 
  • 激活WifiManager.WifiLock上锁
    /** 
     * 加上锁 
     */  
    public void lockWifi(){  
        wifiLock.acquire();  
    }  
  • 释放WifiManager.WifiLock
/** 
 * 释放锁 
 */  
public void releaseLock(){  
    if (wifiLock.isHeld()) {  
        wifiLock.release();  
    }  
} 
  • 判断WifiManager.WifiLock是否被持有
    /** 
     * 判断wifi的锁是否持有 
     *  
     * @return 
     */  
    public boolean isHeld(){  
        return wifiLock.isHeld();  
    }  

4、打开、关闭、断开Wi-Fi连接

    /**
     * 打开Wifi
     **/
    public void OpenWifi() {
        if (!this.wifiManager.isWifiEnabled()) { //当前wifi不可用
            this.wifiManager.setWifiEnabled(true);
        }
    }

    /**
     * 关闭Wifi
     **/
    public void closeWifi() {
        if (wifiManager.isWifiEnabled()) {
            wifiManager.setWifiEnabled(false);
        }
    }

    /**
     * 端口指定id的wifi
     **/
    public void disconnectWifi(int netid) {
        this.wifiManager.disableNetwork(netid);
    }

5、通过WifiInfo实例获取Wifi的各种信息

方法说明
String getBSSID()获取BSSID
static NetworkInfo.DetailedState getDetailedStateOf(SupplicantState suppState)获取网络链接的状态。
boolean getHiddenSSID()
int getIpAddress()
int getLinkSpeed()Returns the current link speed in LINK_SPEED_UNITS.
String getMacAddress()
int getNetworkId()返回NetId
int getRssi()返回当前信号的强度,单位dBm,通常wifi模块获取wifi信号强度值时会在-20~-100之间的值,-20最好
String getSSID()Returns the service set identifier (SSID) of the current 802.11 network.

二、实时监测Wi-Fi信息

public class MainActivity extends Activity {

    private WifiManager wifiManager;
    private WifiInfo wi;            // WifiInfo在包android.net.wifi.WifiInfo中
    private int strength;           //信号强度
    private TextView tvwifi;
    //android wifi模块获取wifi信号强度值时我们通常会得到-20~-80之间的值
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        tvwifi= (TextView) findViewById(R.id.tv_signal);
        new SignalThread().start();
    }
    class SignalThread extends Thread{
        @Override
        public void run() {
            do{
                try{
                    Thread.sleep(3000);
                    Message msg = new Message();
                    msg.what = 1;//what,int类型,未定义的消息,以便接收消息者可以鉴定消息是关于什么的。每个句柄都有自己的消息命名空间,不必担心冲突
                    mHandler.sendMessage(msg);
                }
                catch (InterruptedException e){
                    e.printStackTrace();
                }
            }while (true);
        }
    }
    private StringBuilder stringBuilder=new StringBuilder();
    private SimpleDateFormat    formatter    =   new SimpleDateFormat("yyyy年MM月dd日    HH:mm:ss     ");


    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {

            super.handleMessage(msg);
            switch(msg.what){
                case 1:
                    //使用getSystemService(String)来取回WifiManager然后处理wifi接入,
                    wi = wifiManager.getConnectionInfo();//getConnectionInfo返回wifi连接的动态信息
                    Calendar cal = Calendar.getInstance();
                    String currdate=String.valueOf(cal.get(Calendar.HOUR))+":"+cal.get(Calendar.MINUTE)+":"+cal.get(Calendar.SECOND);
                    if(wi.getBSSID() != null)//getBSSID返回基本服务集标识符,如果未连接,返回null,否则返回MAC地址形式:XX:XX:XX:XX:XX
                        strength = wi.getRssi();//返回接收到的目前的802.11网络的信号强度
                    stringBuilder.append(currdate+"  BSSID:"+wi.getBSSID()+"  网络:"+wi.getSSID()+"  信号强度:"
                            +((Integer) strength).toString()+"连接速度:"+wi.getLinkSpeed());
                    stringBuilder.append("\n");
                    tvwifi.setText(stringBuilder.toString());
                    break;
                default:
                    break;
            }

        }
    };
}

未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CrazyMo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值