我在BroadcastReceiver
中实施了Fragment
:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo networkInfo =
intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(networkInfo.isConnected()) {
//do stuff
}
//Other actions implementation
}
}
};
使用标准注册/取消注册方法:
@Override
public void onStart() {
super.onStart();
getActivity().registerReceiver(receiver, getIntentFilter());
}
@Override
public void onStop() {
super.onStop();
getActivity().unregisterReceiver(receiver);
}
接收者在其他WifiManager.NETWORK_STATE_CHANGED_ACTION
Fragment
具有相同的实现
问题: 每当其中一个片段启动时,此操作就会触发,但我只需要在Wifi真正连接时触发它,并将其作为动作名称触发说WifiManager.NETWORK_STATE_CHANGED_ACTION
,所以它只有在 Wifi状态发生变化
编辑:按原样回复此操作会在默认情况下每次触发,因此我的问题是: Wifi连接没有操作?
答案 0 :(得分:3)
注册NETWORK_STATE_CHANGED_ACTION时,WifiManager的工作原理。注册时,您将立即获得1次更新,以显示当前状态。
为了避免这种情况,您可以在片段集中使用一个简单的布尔值作为默认值' true'。在您的广播接收器中,检查是否为真,如果是,则在您第一次获得更新时,将其设置为false,然后忽略更新。下次调用时,布尔值为true,您可以使用数据。
private boolean firstTime = true;
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(firstTime) {
firstTime = false;
return;
}
if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
NetworkInfo networkInfo =
intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(networkInfo.isConnected()) {
//do stuff
}
//Other actions implementation
}
}
};
答案 1 :(得分:1)
NETWORK_STATE_CHANGED_ACTION广播很可能"粘贴",使用isInitialStickyBroadcast方法检查广播是否是第一个"粘贴"之一:
@Override
public void onReceive (Context context, Intent intent) {
if (!isInitialStickyBroadcast()) {
// Only check updates in state
}
}
答案 2 :(得分:0)
见"ConnectivityManager.NetworkCallback"。这仅适用于API 21及更高版本。这可能没有您所追求的确切条件,但已接近。