2011-12-15 3 views
1

У меня странная проблема. У меня очень простой кусок кода, который предназначен для запуска всякий раз, когда кто-то подключается к точке доступа Wi-Fi.Нажатие кнопки «Назад» или «Дом» вызывает изменение связи?

IntentFilter ConnectedFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
getApplicationContext().registerReceiver(ConnectedToAPReceiver, ConnectedFilter); 

    private BroadcastReceiver ConnectedToAPReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) 
     { 
      final String action = intent.getAction(); 

      if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) 
      { 
       ConnectivityManager connManager = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); 
       NetworkInfo Wifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
       if (Wifi.isConnected()) 
       { 
         // If we get here, it means that the user has just connected to wifi. 
       } 
      } 
     } 
}; 

Этот код очень хорошо работает для того, что мне нужно. Однако я получаю странное явление, когда нажата кнопка «Назад» или «Дом», также запускается широковещательный приемник. Кроме того, загрузка приложения также запускает это приложение.

Кто-нибудь знает, почему нажатие этих кнопок будет отображаться Android как вызывающее изменение связи? И есть ли у кого-нибудь идеи, как легко различать эти нажатия кнопок и действительное изменение связи.


Это часть решения благодаря некоторой работе.

Во-первых, у меня есть два класса, класс активности и класс обслуживания. В моем классе активности я устанавливаю переменную в классе службы с использованием широковещательного приемника при вызове onPause и onDestroy. (Они срабатывают, когда пользователь нажимает эти кнопки). Получатель в классе обслуживания выбирает это намерение и устанавливает переменную public.

Затем в классах activity onResume я проверяю эту переменную и посылаю другое намерение службе, чтобы сбросить переменную до состояния по умолчанию. Здесь я также устанавливаю локальный флаг. Когда я делаю какую-либо обработку, я просто заранее проверяю этот флаг и обрабатываю его соответствующим образом.

ответ

1

Я также могу подтвердить это поведение в моих приложениях. Я не верю, что это действие отжимания назад или дома, которое действительно вызывает это, скорее, что все, что сейчас возобновляется в результате спины или дома (видимо, виджеты в домашнем случае), использует сетевое соединение, запросил или начал использовать соединение, и это повлияло на запуск вашего широковещательного приемника.

Если вы не хотите отвечать на эти ложные срабатывания, вы можете сделать немного больше обработки намерения, которое получает ваш BroadcastReceiver, и, возможно, отслеживать состояние подключения Wi-Fi в вашем приемнике, чтобы вы не предпринимали каких-либо действий, когда вы получаете другое CONNECTIVITY_ACTION, но знайте, что Wi-Fi уже подключен.

документация вокруг некоторых из них Арент супер ясно, но вот некоторые дополнительные вещи, которые вы можете инспектировать о намерении, которые могут помочь вам решить, будет ли или не нужно делать что-то:

// true when there is no connectivity whatsoever 
boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); 

// lots of extra info & detailed state about the connection 
// see http://developer.android.com/reference/android/net/NetworkInfo.html 
NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); 

NetworkInfo otherNetworkInfo = (NetworkInfo)intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); 

String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 
boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 
+0

Очень правильный комментарий. Я понял это и добавил дополнительную проверку. Если кому-то это интересно, я редактировал свой вопрос, чтобы описать, как я его решил. – Dave

Смежные вопросы