Широковещательный приемник вызывает два вызова
Попытка проверить подключение к Интернету в моем приложении.
Существует код моего манифеста:
<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>
И есть класс handle:
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 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
Итак, получатель дважды звонил. Зачем? Существует некоторая проблема со всеми типами соединений.
Ответы
Ответ 1
Предполагая, что вы получите подключенное сообщение, когда 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 отдельно
Ответ 2
Вам также может потребоваться проверить, является ли полученное намерение одним из важных событий, проверив isStickyBroadcast в вашем приемнике. Если это так, вы можете игнорировать его и продолжать. Вы получаете липкие трансляции, как только регистрируется получатель.
http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast%28%29
Ответ 3
Объяснено в документах:
" Изменения в подключении устройства могут быть очень частыми.. Эта трансляция запускается каждый раз, когда вы перемещаетесь между мобильными данными и 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;