每次都会触发WifiManager.NETWORK_STATE_CHANGED_ACTION

时间:2015-05-25 14:52:32

标签: android broadcastreceiver wifimanager

我在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连接没有操作?

3 个答案:

答案 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及更高版本。这可能没有您所追求的确切条件,但已接近。