Android Нажатие кнопки «Назад» или «Домой» вызывает изменение подключения? - PullRequest
1 голос
/ 15 декабря 2011

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

1 Ответ

1 голос
/ 15 декабря 2011

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

Если вы не хотите отвечать на эти ложные срабатывания, вы можете немного больше обработать намерение, полученное вашим 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...