2015-05-25 3 views
0

У меня есть этот BroadcastReceiver реализацию в моем Fragment:WifiManager.NETWORK_STATE_CHANGED_ACTION запускает каждый раз

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

T он вопрос: это действие вызывает каждый раз один из фрагментов начал, но мне это нужно, чтобы вызвать только если Wi-Fi был действительно просто подключен, а также имя действия говорит WifiManager.NETWORK_STATE_CHANGED_ACTION, поэтому он должен работать только если Wifi изменения состояния

Редактировать: как было указано, что это действие будет срабатывать каждый раз по умолчанию, так что мой вопрос: Нет никаких действий для Wi-Fi соединение?

+0

Я думаю, что лучшим вариантом было бы иметь только один BroadcastReceiver в Activity и методы вызова в текущем активном фрагменте при изменении состояния соединения. –

ответ

1

Так работает WifiManager, когда вы регистрируетесь для NETWORK_STATE_CHANGED_ACTION. Когда вы зарегистрируете его, вы сразу получите 1 обновление, чтобы показать текущее состояние.

Чтобы обойти это, вы можете иметь простой булевский фрагмент, установленный по умолчанию как 'true'. В своем широковещательном приемнике проверьте, действительно ли это так, и если да, то это первый раз, когда вы получаете обновление, устанавливаете его в false, а затем просто игнорируете обновление. В следующий раз, когда он будет вызван, логическое значение будет истинным, и вы сможете использовать данные.

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 
       } 
      } 
    }; 
+0

Я не могу этого сделать, потому что я переключаюсь между двумя фрагментами, и по крайней мере один из них будет воссоздан каждый раз. Итак, для __Wifi connect__ нет никаких действий? –

1

NETWORK_STATE_CHANGED_ACTION вещания, скорее всего, "липкий", используйте метод проверки isInitialStickyBroadcast если широковещательный является первым "липкий" один:

@Override 
public void onReceive (Context context, Intent intent) { 
    if (!isInitialStickyBroadcast()) { 
    // Only check updates in state 
    } 
} 
Смежные вопросы