为什么我的 BroadcastReceiver On Wifi 更改时有多个状态更改
Why do I have several states change for a BroadcastReceiver On Wifi changes
我想检测 wifi on/off 变化。我下面的代码工作正常,但我经历了广播接收器的几次迭代。
例如,如果我在设置中打开 wifi,我将获得 8 倍的 false 和 2 倍的 true 作为布尔值。
正常吗?
public class MainActivity extends AppCompatActivity {
TextView wifistate = null;
BroadcastReceiver broadcastReceiver;
WifiManager wifi;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
wifistate = (TextView) findViewById(R.id.wifistate);
wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
boolean connected = info.isConnected();
if (connected) {
Log.i("RCVR", "True");
wifistate.setText("Connected");
} else {
Log.i("RCVR", "False");
wifistate.setText("Disconnected");
}
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(broadcastReceiver, intentFilter);
}
}
这是迭代。最终结果是正确的。
我以前见过这个。所以这就是我所做的。
注意:我为接收器使用了不同的 action
。
这是您的解决方案:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(broadcastReceiver, intentFilter);
那么接收者:
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Bundle extras = intent.getExtras();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = (NetworkInfo) extras.get(ConnectivityManager.EXTRA_NETWORK_INFO);
boolean connected = info.isConnected();
if (connected && isWifiConnected()) {
Log.i("RCVR", "True");
wifistate.setText("Connected");
} else {
Log.i("RCVR", "False");
wifistate.setText("Disconnected");
}
}
}
};
检查WiFi是否连接:
public static boolean isWifiConnected() {
ConnectivityManager cm = (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE);
return (cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI);
}
通过这种方式,您可以检查连接是否可用并检查连接是否为 WiFi。
它似乎对我有用。希望对你有帮助。
我想检测 wifi on/off 变化。我下面的代码工作正常,但我经历了广播接收器的几次迭代。 例如,如果我在设置中打开 wifi,我将获得 8 倍的 false 和 2 倍的 true 作为布尔值。 正常吗?
public class MainActivity extends AppCompatActivity {
TextView wifistate = null;
BroadcastReceiver broadcastReceiver;
WifiManager wifi;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
wifistate = (TextView) findViewById(R.id.wifistate);
wifi = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
boolean connected = info.isConnected();
if (connected) {
Log.i("RCVR", "True");
wifistate.setText("Connected");
} else {
Log.i("RCVR", "False");
wifistate.setText("Disconnected");
}
}
}
};
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
registerReceiver(broadcastReceiver, intentFilter);
}
}
这是迭代。最终结果是正确的。
我以前见过这个。所以这就是我所做的。
注意:我为接收器使用了不同的 action
。
这是您的解决方案:
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(broadcastReceiver, intentFilter);
那么接收者:
BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Bundle extras = intent.getExtras();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
NetworkInfo networkInfo = (NetworkInfo) extras.get(ConnectivityManager.EXTRA_NETWORK_INFO);
boolean connected = info.isConnected();
if (connected && isWifiConnected()) {
Log.i("RCVR", "True");
wifistate.setText("Connected");
} else {
Log.i("RCVR", "False");
wifistate.setText("Disconnected");
}
}
}
};
检查WiFi是否连接:
public static boolean isWifiConnected() {
ConnectivityManager cm = (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE);
return (cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI);
}
通过这种方式,您可以检查连接是否可用并检查连接是否为 WiFi。
它似乎对我有用。希望对你有帮助。