Странное поведение CONNECTIVITY_ACTION
Этот пост может показаться длинным.. Но все очень просто. Поэтому, пожалуйста, помогите. Благодарю.
Одним словом, всякий раз, когда происходит изменение подключения с Wi-Fi на мобильный телефон, я получаю сообщение в моем приемнике вещания 2 раза (в первый раз сеть не обнаружена). И когда я перехожу с мобильного телефона на Wi-Fi, я получаю его три раза. Может кто-нибудь, пожалуйста, объясните мне это странное поведение.
Я реализовал код с использованием IntentFilterConnectivityManager.CONNECTIVITY_ACTION) и зарегистрировал его для получателя.
IntentFilter mNetworkStateFilter = new IntentFilter (ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNetworkStateReceiver , mNetworkStateFilter);
private final BroadcastReceiver mNetworkStateReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
//The Network State has Been Changed
Log.d(TAG, "CHANGE HAPPENED" );
if (networkInfo != null)
{
Log.d(TAG, "Connected To: " + networkInfo.getTypeName());
Log.d(TAG, "NUMBER: " + networkInfo.getType());
Log.d(TAG, "isConnectedOrConnecting: " + networkInfo.isConnectedOrConnecting());
Log.d(TAG, "isConnected: " + networkInfo.isConnected());
Log.d(TAG, "isFailover: " + networkInfo.isFailover());
Log.d(TAG, "Reason :" + networkInfo.getReason());
Log.d(TAG, "Details " + networkInfo.getDetailedState() );
boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);
boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false);
Log.d(TAG, "noConnectivity: " + noConnectivity);
Log.d(TAG, "reason: " + reason);
Log.d(TAG,"DONE");
}
}
};
Я заметил следующее поведение. Может кто-нибудь объяснить, пожалуйста, причину этого произошло.
Изначально Мое устройство подключено к Wi-Fi.
APK теперь развернут на устройстве.
Моя запись Logcat: D/MainActivity(32005): ИЗМЕНЕНО СДЕЛАНО D/MainActivity(32005): подключен к WIFI
Это понятно.
Теперь Маршрутизатор выключен. Так что теперь устройство пытается подключиться к 4G. Теперь Logcat Entry выглядит следующим образом.
D/MainActivity(32005): ИЗМЕНЕНИЕ ПРОИЗВЕДЕНО D/MainActivity(32005): ИЗМЕНЕНИЕ ПРОИЗОШЕНО D/MainActivity(32005): подключено к мобильному
Это может быть связано с тем, что при первом разрыве соединения происходит печать CHANGE HAPPENED, но не сообщение "Connected to". И затем соединение устанавливается с мобильным, что приводит к другому ИЗМЕНЕНИЮ, произошедшему с подключенным к мобильному.
Теперь роутер снова включен.
Но на этот раз LogCat сообщает, D/MainActivity(32005): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D/MainActivity(32005): подключен к WIFI
D/MainActivity(32005): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D/MainActivity(32005): подключен к WIFI
D/MainActivity(32005): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D/MainActivity(32005): подключен к WIFI
Я не могу понять, почему Logcat сообщил об этом сообщении три раза. Может кто-нибудь, пожалуйста, помогите мне понять это поведение.
Это мой файл манифеста.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wififourghandoff"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ЭТО МОЕ НАБЛЮДЕНИЕ.
Последовательность похожа на следующую:
Wi-Fi для мобильных устройств: 1. Информация о сети имеет значение NULL. 2. Объект Netowrk Info существует, а причина (networkInfo.getReason ()) - dataEnabled.
С мобильного на Wifi: 1. Получено широковещательное сообщение. 2. Информационный объект Netowrk Exists и "причина (networkInfo.getReason ()" является dataDisabled. 3.NETworkInfo с Exists с "причиной (networkInfo.getReason ()" равной нулю
МОЕ Устройство изначально подключено к WIFI My Logcat
D / MainActivity (880): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D / MainActivity (880): подключен к: WIFI
D / MainActivity (880): НОМЕР: 1
D / MainActivity (880): isConnectedOrConnecting: true
D / MainActivity (880): isConnected: true
D / MainActivity (880): isFailover: false
D / MainActivity (880): причина: ноль
D / MainActivity (880): Подробности подключены
D / MainActivity (880): noConnectivity: false
D / MainActivity (880): причина: ноль
D / MainActivity (880): СДЕЛАНО
ТЕПЕРЬ WIFI выключен. Так что теперь мое устройство переходит в МОБИЛЬНЫЙ. Ниже приводится Logcat.
D / MainActivity (880): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D / MainActivity (880): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D / MainActivity (880): подключен к: мобильному
D / MainActivity (880): НОМЕР: 0
D / MainActivity (880): isConnectedOrConnecting: true
D / MainActivity (880): isConnected: true
D / MainActivity (880): isFailover: правда
D / MainActivity (880): причина: dataEnabled
D / MainActivity (880): Подробности подключены
D / MainActivity (880): noConnectivity: false
D / MainActivity (880): причина: dataEnabled
D / MainActivity (880): СДЕЛАНО
ТЕПЕРЬ мой WIFI включен. И мое устройство отправляется обратно в Wi-Fi.
D / MainActivity (880): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D / MainActivity (880): подключен к: WIFI
D / MainActivity (880): НОМЕР: 1
D / MainActivity (880): isConnectedOrConnecting: true
D / MainActivity (880): isConnected: true
D / MainActivity (880): isFailover: false
D / MainActivity (880): причина: ноль
D / MainActivity (880): Подробности подключены
D / MainActivity (880): noConnectivity: false
D / MainActivity (880): причина: ноль
D / MainActivity (880): СДЕЛАНО
D / MainActivity (880): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D / MainActivity (880): подключен к: WIFI
D / MainActivity (880): НОМЕР: 1
D / MainActivity (880): isConnectedOrConnecting: true
D / MainActivity (880): isConnected: true
D / MainActivity (880): isFailover: false
D / MainActivity (880): причина: ноль
D / MainActivity (880): Подробности подключены
D / MainActivity (880): noConnectivity: false
D / MainActivity (880): причина: dataDisabled
D / MainActivity (880): СДЕЛАНО
D / MainActivity (880): ИЗМЕНЕНИЕ ПРОИЗОШЛО
D / MainActivity (880): подключен к: WIFI
D / MainActivity (880): НОМЕР: 1
D / MainActivity (880): isConnectedOrConnecting: true
D / MainActivity (880): isConnected: true
D / MainActivity (880): isFailover: false
D / MainActivity (880): причина: ноль
D / MainActivity (880): Подробности подключены
D / MainActivity (880): noConnectivity: false
D / MainActivity (880): причина: ноль
D / MainActivity (880): СДЕЛАНО
Спасибо и привет, Юви
2 ответа
Я думаю, что если вы войдете Extra
содержание поведения может иметь больше смысла:
http://developer.android.com/reference/android/net/ConnectivityManager.html
Произошло изменение подключения к сети. Соединение было установлено или потеряно.NETworkInfo для уязвимой сети отправляется как дополнительная; следует проконсультироваться, чтобы увидеть, какое событие подключения произошло.
Если это соединение, которое было результатом аварийного переключения из отключенной сети, тогда для логического параметра FAILOVER_CONNECTION установлено значение true.
В случае потери подключения, если диспетчер подключения пытается подключиться (или уже подключился) к другой сети, NetworkInfo для новой сети также передается как дополнительная. Это позволяет любым получателям вещания знать, что они не обязательно должны сказать пользователю, что трафик данных будет невозможен. Вместо этого получатель должен вскоре ожидать другую широковещательную рассылку, указывающую либо на то, что попытка аварийного переключения была успешной (и, следовательно, все еще существует общее подключение к данным), либо на то, что попытка аварийного переключения была неудачной, что означает, что все подключения были потеряны.
Для события отключения, логическое значение EXTRA_NO_CONNECTIVITY устанавливается в значение true, если подключенных сетей вообще нет.
Моя интерпретация того, что происходит с тремя событиями, когда WiFi включен:
- Первое событие просто сообщает вам, что WiFi включен.
- Второе событие информирует вас о том, что соединение с сотовой сетью отключено и имеется другая доступная сеть (WiFi). Это событие, которое имеет NetworkInfo.
- По сути, это дубликат события 1. Всякий раз, когда происходит отключенное событие с NetworkInfo, Android обещает, что оно будет следить за событием успеха / сбоя подключения для сети в NetworkInfo.
Таким образом, это немного избыточно для вас, но это нормальное поведение для Android. Вот несколько журналов из моего эксперимента:
08-14 10:58:04.498: DEBUG/WiFiBroadcastReceiver(9161): Bundle[{networkInfo=NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true, inetCondition=0}]
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): Bundle[{extraInfo=VZWINTERNET, otherNetwork=NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true, reason=dataDisabled, networkInfo=NetworkInfo: type: mobile[LTE], state: DISCONNECTED/DISCONNECTED, reason: dataDisabled, extra: VZWINTERNET, roaming: false, failover: false, isAvailable: true, inetCondition=0}]
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): ***********Network Info ******
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): Connected To: WIFI
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): Network Type: 1
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): isConnectedOrConnecting: true
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): isConnected: true
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): isFailover: false
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): Reason :null
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): Details: CONNECTED
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): noConnectivity: false
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): reason: dataDisabled
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): ******************************
08-14 10:58:04.779: DEBUG/WiFiBroadcastReceiver(9161): Bundle[{networkInfo=NetworkInfo: type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true, inetCondition=0}]
Ну, вы могли бы изучить NetworkInfo
который отправляется как дополнительный.
Может случиться так, что он получает сообщение об отказоустойчивости, как описано в документации, - когда он выходит из строя в первый раз, получает сообщение и затем успешно соединяется снова.
В случае потери подключения, если диспетчер подключения пытается подключиться (или уже подключился) к другой сети, NetworkInfo для новой сети также передается как дополнительная. Это позволяет любым получателям вещания знать, что они не обязательно должны сказать пользователю, что трафик данных будет невозможен. Вместо этого получатель должен вскоре ожидать другую широковещательную рассылку, указывающую либо на то, что попытка аварийного переключения была успешной (и, следовательно, все еще существует общее подключение к данным), либо на то, что попытка аварийного переключения была неудачной, что означает, что все подключения были потеряны.