CONNECTIVITY_ACTION намерение получено дважды, когда Wi-Fi подключен - PullRequest
49 голосов
/ 11 марта 2011

В моем приложении BroadcastReceiver запускается как компонент через тег <receiver> с фильтрацией android.net.conn.CONNECTIVITY_CHANGE намерений.

Моя цель - просто узнать, когда было установлено соединение Wi-Fi, так что я делаю в onReceive() следующее:

NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
    // Wifi is connected
}

Это работает нормально, но я всегда, кажется, получаю два идентичных намерения в течение примерно одной секунды, когда устанавливается соединение Wi-Fi. Я пытался посмотреть любую информацию, которую я мог получить из намерения, ConnectivityManager и WifiManager, но я не могу найти ничего, что отличало бы эти два намерения.

Глядя на журнал, есть по крайней мере еще один BroadcastReceiver, который также получает два идентичных намерения.

Он работает на HTC Desire с Android 2.2

Есть идеи, почему у меня появляется "дублированное" намерение при подключении к Wi-Fi или какая разница между ними может быть?

Ответы [ 14 ]

0 голосов
/ 21 июля 2017

Найден особый случай подключения к сети, в котором говорится, что интернета нет, но на самом деле он есть.Оказывается, getActiveNetworkInfo всегда будет возвращать вам ОТКЛЮЧЕНО / ЗАБЛОКИРОВАНО в конкретном случае, когда сеть меняется при низком уровне заряда батареи и приложение только что переключилось

Проверьте этот пост

0 голосов
/ 29 сентября 2016

проверьте networkType из намерения и сравните activeNetworkInfo.getType ()

                 Bundle bundle = intent.getExtras();
                 ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                 NetworkInfo ni = manager.getActiveNetworkInfo();

                 if(ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
                     if(bundle.getInt("networkType") == ni.getType()) {
                         // active network intent
                     }
                 }
0 голосов
/ 23 марта 2015

То, как я справился с этим, было просто сохранить состояние сети, а затем сравнить его, чтобы увидеть, было ли изменение .

public class ConnectivityChangedReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        boolean previouslyConnected = MyApp.getInstance().isNetworkPreviouslyConnected();
        boolean currentlyConnected = MyApp.getInstance().isNetworkConnected();

        if (previouslyConnected != currentlyConnected) {
            // do something and reset
            MyApp.getInstance().resetNetworkPreviouslyConnected();
        }
    }

}

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

@Override
public void onResume() {
    super.onResume();
    MyApp.getInstance().resetNetworkPreviouslyConnected();
}

Я сделал это в моем BaseFragment, родителе всех фрагментов в моем приложении.

0 голосов
/ 19 октября 2011

Слушайте только действие "android.net.conn.CONNECTIVITY_CHANGE".Он транслируется всякий раз, когда соединение установлено или разрушено.

"android.net.wifi.STATE_CHANGE" будет транслироваться при установлении соединения.Таким образом, вы получаете два триггера.

Наслаждайтесь!

...