Android Нажатие кнопки «Назад» или «Домой» вызывает изменение подключения?

У меня странная проблема. У меня есть очень простой фрагмент кода, который должен срабатывать всякий раз, когда кто-то подключается к точке доступа 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. (Они срабатывают, когда пользователь нажимает эти кнопки). Получатель в классе обслуживания улавливает это намерение и устанавливает общедоступную переменную.

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


person Dave    schedule 15.12.2011    source источник


Ответы (1)


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

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

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

// 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);
person mmeyer    schedule 15.12.2011
comment
Очень правильный комментарий. Я понял это и добавил дополнительную проверку. Если кому-то это интересно, я отредактировал свой вопрос, чтобы описать, как я его решил. - person Dave; 04.01.2012