《Android wifi系列文章四》广播接收者接收wifi的状态改变
上一篇文章,我们把核心类过了一次,大家把注释看完就差不多了。主要是知道有什么方法用于操作wifi,这里的话我们接着上一篇文章,我们把这个广播接收者也实现它。
我们要监听的广播有那些呢?
上一篇文章,我们把核心类过了一次,大家把注释看完就差不多了。主要是知道有什么方法用于操作wifi,这里的话我们接着上一篇文章,我们把这个广播接收者也实现它。
Paste_Image.png我们要监听的广播有那些呢?
/**
* Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
* enabling, disabling, or unknown. One extra provides this state as an int.
* Another extra provides the previous state, if available.
*
* @see #EXTRA_WIFI_STATE
* @see #EXTRA_PREVIOUS_WIFI_STATE
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String WIFI_STATE_CHANGED_ACTION =
"android.net.wifi.WIFI_STATE_CHANGED";
这个Action呢,用于监听wifi的开关状态。它有5中状态,分别是:打开状态,打开中状态,关闭状态,关闭中状态,未知状态。上面的文档也说到了,我们可以通过:
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
来获取到wifi的状态。而默认的话给0即可, 默认是不可用嘛!
具体的状态值如下:
/**
* Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if
* it finishes successfully.
*
* @see #WIFI_STATE_CHANGED_ACTION
* @see #getWifiState()
*/
public static final int WIFI_STATE_DISABLING = 0;
/**
* Wi-Fi is disabled.
*
* @see #WIFI_STATE_CHANGED_ACTION
* @see #getWifiState()
*/
public static final int WIFI_STATE_DISABLED = 1;
/**
* Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if
* it finishes successfully.
*
* @see #WIFI_STATE_CHANGED_ACTION
* @see #getWifiState()
*/
public static final int WIFI_STATE_ENABLING = 2;
/**
* Wi-Fi is enabled.
*
* @see #WIFI_STATE_CHANGED_ACTION
* @see #getWifiState()
*/
public static final int WIFI_STATE_ENABLED = 3;
/**
* Wi-Fi is in an unknown state. This state will occur when an error happens while enabling
* or disabling.
*
* @see #WIFI_STATE_CHANGED_ACTION
* @see #getWifiState()
*/
public static final int WIFI_STATE_UNKNOWN = 4;
如果你要获取前一个wifi的状态也是可以的哦,使用这个键就可以了:EXTRA_PREVIOUS_WIFI_STATE
好啦,那么这个意图就讲到这里啦,下面继续下一个吧!
/**
* An access point scan has completed, and results are available from the supplicant.
* Call {@link #getScanResults()} to obtain the results. {@link #EXTRA_RESULTS_UPDATED}
* indicates if the scan was completed successfully.
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
上面这个呢是扫描结果的通知广播,也就是说,当我们在wifi控制器类中发起扫描的时候,扫描有结果了,那么系统就会发出这个广播,当我们收到这个广播以后,我们就可以去wifi控制器里头拿扫描结果了。
/**
* Broadcast intent action indicating that the state of Wi-Fi connectivity
* has changed. One extra provides the new state
* in the form of a {@link android.net.NetworkInfo} object. If the new
* state is CONNECTED, additional extras may provide the BSSID and WifiInfo of
* the access point.
* as a {@code String}.
* @see #EXTRA_NETWORK_INFO
* @see #EXTRA_BSSID
* @see #EXTRA_WIFI_INFO
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
上面这个意图呢用于判断wifi连接的,如果已经连接上的话,我们可以拿到wifi的信息,SSID,已经网络信息,再用这些信息去更新UI显示。
其实,基本这三个Action就够了,如果还要知道连接中的状态改变,那么还需要监听这个Action:
/**
* Broadcast intent action indicating that the state of establishing a connection to
* an access point has changed.One extra provides the new
* {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and
* is not generally the most useful thing to look at if you are just interested in
* the overall state of connectivity.
* @see #EXTRA_NEW_STATE
* @see #EXTRA_SUPPLICANT_ERROR
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String SUPPLICANT_STATE_CHANGED_ACTION =
"android.net.wifi.supplicant.STATE_CHANGE";
这里的话,我们监听三个。你可能使用动态注册,动态注册的话,记得要在销毁的时候,进行取消注册,否则会导致内存泄露的呢!
动态注册的代码:
/**
* 在这里注册广播接收者
* 这里面注册广播的话,包括:
* 1 wifi开启状态的监听(wifi关闭,wifi打开)
* 2 wifi连接的广播
* 3 wifi连接状态改变的广播
* <p>
*/
private void registerBroadcastReceiver() {
IntentFilter filter = new IntentFilter();
//设置意图过滤
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
wifiReceiver = new WifiReceiver(listener);
registerReceiver(wifiReceiver, filter);
}
那么取消注册的代码如下:
if (null != wifiReceiver) {
unregisterReceiver(wifiReceiver);
}
好啦,到这里的话就解释完了,具体的话看代码吧,看下面的代码,有注释的呢。后面的回调我们再下一篇文章中解释吧!
package cn.com.sunofbeaches.wifidemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import cn.com.sunofbeaches.wifidemo.interfaces.WifiReceiverActionListener;
/**
* Created by Administrator on 2017/2/25.
*/
public class WifiReceiver extends BroadcastReceiver {
private final WifiReceiverActionListener mListener;
public WifiReceiver(WifiReceiverActionListener listener) {
//通过构造方法把回调接口扔进来
this.mListener = listener;
}
@Override
public void onReceive(Context context, Intent intent) {
//判断Action
String action = intent.getAction();
if (null == mListener) {
return;
}
switch (action) {
case WifiManager.WIFI_STATE_CHANGED_ACTION:
//WIFI打开还是关闭或者是位置状态
handlerWifiState(intent);
break;
case WifiManager.SCAN_RESULTS_AVAILABLE_ACTION:
//扫描结果
handlerWifiScanResult();
break;
case WifiManager.NETWORK_STATE_CHANGED_ACTION:
//用于判断连接状态
handlerWifiConnectState(intent);
break;
}
}
/**
* 这个方法用于处理wifi的连接状态发生改变
*
* @param intent
*/
private void handlerWifiConnectState(Intent intent) {
//拿到NetworkInfo
NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
//判断连接上了哈
if (null != networkInfo && networkInfo.isConnected()) {
//连接上了,就把wifi的信息传出去
WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
if (wifiInfo != null) {
//把结果回传出去
mListener.onWifiConnected(wifiInfo);
}
}
}
/**
* 这个方法用于通知wifi扫描有结果
*/
private void handlerWifiScanResult() {
mListener.onWifiScanResultBack();
}
/**
* 这个方法用于处理wifi的状态,打开,打开中..关闭,关闭中..
*
* @param intent
*/
private void handlerWifiState(Intent intent) {
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
//对wifi的状态进行处理
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED:
//wifi已经打开..
mListener.onWifiOpened();
break;
case WifiManager.WIFI_STATE_ENABLING:
//wifi打开中..
mListener.onWifiOpening();
break;
case WifiManager.WIFI_STATE_DISABLED:
//wifi关闭了..
mListener.onWifiClosed();
break;
case WifiManager.WIFI_STATE_DISABLING:
//wifi关闭中..
mListener.onWifiClosing();
break;
case WifiManager.WIFI_STATE_UNKNOWN:
//未知状态..
break;
}
}
}
这个接受者的构造方法,我们需要传下一个回调接口,这个回调接口是用于通知UI更新的,这样子的话,不管是那个界面要更新UI,都可以传个接口就行了嘛。
具体这个接口怎么写,会在下一篇文章中解释!感谢你的阅读,喜欢就点赞吧!分享也行哈!!
转载请说明出处,本文地址:
http://bbs.sunofbeaches.com/thread-5769-1-1.html
网友评论