2013-04-11 2 views
11

Попытка проверить подключение к Интернету в моем приложении. Существует код моего манифеста:Broadcast Receiver звонит дважды

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
     <receiver android:name=".MyReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
     </intent-filter> 
    </receiver> 

И есть класс ручки:

public class MyReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction() != null && intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")); 
    { 
     Log.d("myLogs", "Network connectivity change"); 
     if (intent.getExtras() != null) { 
      NetworkInfo ni = (NetworkInfo) intent.getExtras().get(
        ConnectivityManager.EXTRA_NETWORK_INFO); 
      if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) { 
       Log.i("myLogs", "Network " + ni.getTypeName() + " connected"); 
      } 
     } 
     if (intent.getExtras().getBoolean(
       ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { 
      Log.d("myLogs", "There's no network connectivity"); 
     } 
    } 
} 

}

В моей LogCat я получить картину вроде:

04-11 23:24:48.021: D/myLogs(10261): Network connectivity change 
04-11 23:24:48.021: I/myLogs(10261): Network WIFI connected 
04-11 23:24:48.202: D/myLogs(10261): Network connectivity change 
04-11 23:24:48.202: I/myLogs(10261): Network WIFI connected 

Итак, ресивер звонил дважды. Зачем? Существует некоторая проблема со всеми типами соединений.

+0

Возможно, существуют разные уровни подключения, а ваши 2 журнала - это 2 разных под-состояния. Я выхожу из дополнительной информации, чтобы узнать, как они отличаются. –

+0

Попробуйте войти 'если (NETINFO! = NULL && netInfo.isConnected()) { \t \t \t \t \t Log.i ("Сеть" "myLogs" + NETINFO.getTypeName() + "connected"); \t \t \t} ' есть идея, что есть два суб-состояние - isConnecting и IsConnected, но та же проблема/ – Sunstrike

ответ

3

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

Чтобы узнать, что сообщение было вызвано, вы можете иметь статическое логическое значение, которое переключается между подключением и отключением и вызывает вызовы только подпрограмм, когда вы получаете соединение, а логическое значение - true. Что-то вроде:

public class ConnectionChangeReceiver extends BroadcastReceiver { 
    private static boolean firstConnect = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     final NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
     if (activeNetInfo != null) { 
      if(firstConnect) { 
       // do subroutines here 
       firstConnect = false; 
      } 
     } 
     else { 
      firstConnect= true; 
     } 
    } 
} 

Примечание

Есть две вещи, которые нужно следить. Сначала - где-то хранить «firstConnect», например, в общих предпочтениях, а во-вторых, когда вы переходите с 3G на Wi-Fi, фактического отключения нет, поэтому лучше обрабатывать события 3G и WiFi отдельно.

+1

не работает для меня и является копией этого ответа http://stackoverflow.com/questions/8412714/BroadcastReceiver-получает-множественные идентичные-сообщения к одному-событию/8413512 # 8413512 – DJphy

1

Возможно, вам также понадобится проверьте, является ли полученное намерение одним из важных событий, проверив isStickyBroadcast в вашем приемнике. Если это так, вы можете игнорировать его и продолжать. Вы получаете липкие трансляции, как только регистрируется получатель.

http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast%28%29

0

Разъяснения в документации:

"изменения в связи беспроводного устройства может быть очень частым -за широковещательный срабатывает каждый раз, когда вы перемещаетесь между мобильными данными и Wi-Fi В результате. , Это хорошая практика для мониторинга этой трансляции только тогда, когда вы ранее приостановили обновления или загрузки, чтобы возобновить их. Обычно достаточно просто проверить подключение к Интернету до начала обновления и, если их не будет, приостановить дальнейшие обновления до тех пор, пока связь восстановлена ​​».

Редактировать: Забыл добавить ... широковещательный приемник только для того, чтобы узнать, подключено ли устройство, немного в форме hoverhead. Из тех же документов:

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; 
Смежные вопросы