BroadcastReceiver是Android中的一种组件,用于接收系统和应用程序发出的广播消息。广播可以是系统级别的,如设备开机、网络状态变化等,也可以是应用程序级别的,如自定义广播消息。
BroadcastReceiver可以通过注册接收器的方式来接收广播消息,可以在AndroidManifest.xml文件中静态注册,也可以在代码中动态注册。一旦注册完成后,当有广播消息被发出时,BroadcastReceiver会自动接收并处理该消息
Android7.0之后,如果我们需要实时监听监听网络状态变化,需要动态注册广播;
一、动态注册广播
private NetState netState;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wifi);
//注册广播
netState = new NetState();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
this.registerReceiver(netState, filter);
}
二、方法
//--------- 判断WiFi的连接状态 -------
public class NetState extends BroadcastReceiver {
@SuppressLint("SetTextI18n")
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null) return;
String action = intent.getAction();
if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
//主要用来判断密码错误,认证失败
int error = intent.getIntExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, 0);
if (WifiManager.ERROR_AUTHENTICATING == error) {
//密码错误,认证失败
Log.e(TAG, "密码错误或认证失败");
}
} else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if (info == null) return;
Log.e(TAG, "State: " + info.getState());
// if (info.getState().equals(NetworkInfo.State.DISCONNECTED)) {
// Log.e(TAG, "连接已断开");
// } else if (info.getState().equals(NetworkInfo.State.CONNECTED)) {
// } else {
NetworkInfo.DetailedState state = info.getDetailedState();
//Log.e(TAG, "DetailedState : "+state.toString());
if (state == NetworkInfo.DetailedState.CONNECTING) {
Log.e(TAG, "WIFI连接中...");
} else if (state == NetworkInfo.DetailedState.AUTHENTICATING) {
Log.e(TAG, "WIFI正在验证身份信息...");
} else if (state == NetworkInfo.DetailedState.OBTAINING_IPADDR) {
Log.e(TAG, "WIFI正在获取IP地址...");
} else if (state == NetworkInfo.DetailedState.CONNECTED) {
Log.e(TAG, "WIFI连接成功");
WifiInfo wifiInfo = getCurrentWifiInfo();
Toast.makeText(WifiActivity.this, "已连接到WIFI : " + wifiInfo.getSSID(), Toast.LENGTH_SHORT).show();
invalidateOptionsMenu();
mWifiApState = "已连接";
} else if (state == NetworkInfo.DetailedState.DISCONNECTED) {
Log.e(TAG, "WIFI连接断开");
Toast.makeText(WifiActivity.this, "WIFI连接断开", Toast.LENGTH_SHORT).show();
mWifiApState = "未连接";
invalidateOptionsMenu();
} else if (state == NetworkInfo.DetailedState.FAILED) {
Log.e(TAG, "WIFI连接失败");
Toast.makeText(WifiActivity.this, "WIFI连接失败", Toast.LENGTH_SHORT).show();
invalidateOptionsMenu();
} else if (state == NetworkInfo.DetailedState.SCANNING) {
Log.i(TAG, "WIFI扫描中...");
} else if (state == NetworkInfo.DetailedState.BLOCKED) {
Log.i(TAG, "WIFI访问被阻止");
Toast.makeText(WifiActivity.this, "WIFI访问被阻止", Toast.LENGTH_SHORT).show();
} else if (state == NetworkInfo.DetailedState.VERIFYING_POOR_LINK) {
Log.i(TAG, "WIFI链路连通性差");
} else if (state == NetworkInfo.DetailedState.CAPTIVE_PORTAL_CHECK) {
Log.i(TAG, "WIFI检查网络是否是受控门户");
}
//}
}
}
}
三:在onDestroy()销毁的方法取消注册
@Override
protected void onDestroy() {
super.onDestroy();
if (netState != null) { // 取消注册 BroadcastReceiver
unregisterReceiver(netState);
}
}
如有错误,不吝赐教!!!