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

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

Теги:
connectivity
back-button
android-homebutton

1 ответ

1
Лучший ответ

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

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

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

// 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
    Очень правильный комментарий. Я понял это и добавил дополнительную проверку. Если кому-то это интересно, я отредактировал свой вопрос, чтобы обрисовать, как я это решил.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню