这个职位似乎很长..。但这很简单。所以请帮帮忙。谢谢。
简而言之,每当从Wifi到Mobile的连接性发生变化时,我就会在我的广播接收器中接收到一条消息2次(第一次没有找到网络)。当我从Mobile搬到Wifi时,我收到了三次。有谁能解释一下我这种奇怪的行为吗?
我使用IntentFilterConnectivityManager.CONNECTIVITY_ACTION)实现了一个代码,并将其注册到我的接收器中。
新IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);= IntentFilter mNetworkStateFilter
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");
}
}
};我观察到了以下行为。有人能解释一下发生这种事的原因吗。
最初,我的设备连接到Wifi。
APK现在部署在设备上。
我的日志条目是D/MainActivity(32005):更改发生了D/MainActivity(32005):连接到WIFI
这可以理解。
现在路由器关闭了。因此,现在该设备试图连接到4G。现在,Logcat条目如下所示。
D/MainActivity(32005):更改发生了D/MainActivity(32005):更改发生了D/MainActivity(32005):连接到移动
可能这可以归因于第一个连接中断的事实,这导致更改碰巧被打印出来,而不是“连接到”的消息。然后与Mobile建立连接,从而产生与Mobile连接的另一个变化。
现在路由器又打开了。
但这一次,logcat报告说,D/MainActivity(32005):改变发生了
D/MainActivity(32005):连接WIFI
D/MainActivity(32005):发生了变化
D/MainActivity(32005):连接WIFI
D/MainActivity(32005):发生了变化
D/MainActivity(32005):连接WIFI
我不明白为什么逻辑猫三次报告这个消息。有人能帮我理解一下这种行为吗。
这是我的指甲锉。
<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>这是我的观察。
如下所示的序列:
Wifi到Mobile : 1.网络信息为NULL 2。Netowrk Info对象存在,“原因”(networkInfo.getReason())为dataEnabled。
从手机到Wifi : 1.接收广播消息。2. Netowrk对象存在,“原因”(networkInfo.getReason())是dataDisabled。3.以“networkInfo.getReason()”为空的存在的networkInfo.getReason
我的设备在WIFI上露营,最初是我的Logcat
D/主活动( 880):已发生变化
D/MainActivity( 880):连接: WIFI
D/主要活动( 880):编号:1
D/MainActivity( 880):isConnectedOrConnecting: true
D/MainActivity( 880):isConnected: true
D/MainActivity( 880):isFailover: false
D/MainActivity( 880):原因:null
D/MainActivity( 880):已连接的细节
D/MainActivity( 880):noConnectivity: false
D/MainActivity( 880):原因: null
D活动( 880):已完成
现在无线网络关闭。所以现在我的设备进入了移动设备。下面是Logcat.
D/主活动( 880):已发生变化
D/主活动( 880):已发生变化
D/MainActivity( 880):连接:移动
D/MainActivity( 880):编号:0
D/MainActivity( 880):isConnectedOrConnecting: true
D/MainActivity( 880):isConnected: true
D/MainActivity( 880):isFailover: true
D/MainActivity( 880):原因:启用数据
D/MainActivity( 880):已连接的细节
D/MainActivity( 880):noConnectivity: false
D/MainActivity( 880):原因: dataEnabled
D活动( 880):已完成
现在我的WIFI打开了。我的设备又回到了威菲。。
D/主活动( 880):已发生变化
D/MainActivity( 880):连接: WIFI
D/主要活动( 880):编号:1
D/MainActivity( 880):isConnectedOrConnecting: true
D/MainActivity( 880):isConnected: true
D/MainActivity( 880):isFailover: false
D/MainActivity( 880):原因:null
D/MainActivity( 880):已连接的细节
D/MainActivity( 880):noConnectivity: false
D/MainActivity( 880):原因: null
D活动( 880):已完成
D/主活动( 880):已发生变化
D/MainActivity( 880):连接: WIFI
D/主要活动( 880):编号:1
D/MainActivity( 880):isConnectedOrConnecting: true
D/MainActivity( 880):isConnected: true
D/MainActivity( 880):isFailover: false
D/MainActivity( 880):原因:null
D/MainActivity( 880):已连接的细节
D/MainActivity( 880):noConnectivity: false
D/MainActivity( 880):原因: dataDisabled
D活动( 880):已完成
D/主活动( 880):已发生变化
D/MainActivity( 880):连接: WIFI
D/主要活动( 880):编号:1
D/MainActivity( 880):isConnectedOrConnecting: true
D/MainActivity( 880):isConnected: true
D/MainActivity( 880):isFailover: false
D/MainActivity( 880):原因:null
D/MainActivity( 880):已连接的细节
D/MainActivity( 880):noConnectivity: false
D/MainActivity( 880):原因: null
D活动( 880):已完成
谢谢和问候,尤维
发布于 2012-08-13 22:08:10
我认为,如果您记录Extra内容,这种行为可能更有意义:
动作
网络连接发生了变化。连接已经建立或丢失。受影响网络的NetworkInfo作为额外发送;应该咨询它以查看发生了什么样的连接事件。 如果这是一个连接失败的结果从一个断开的网络,那么FAILOVER_CONNECTION布尔额外设置为真。 对于连接性的丢失,如果连接管理器试图连接(或已经连接)到另一个网络,则新网络的NetworkInfo也作为额外的。这让广播的任何接收者都知道,他们不一定应该告诉用户不可能有任何数据通信。相反,接收者应该期待不久的另一个广播,指示故障转移尝试成功(因此仍然存在总体数据连接),或者故障转移尝试失败,这意味着所有连接都丢失了。 对于断开事件,如果根本没有连接的网络,则布尔额外的EXTRA_NO_CONNECTIVITY设置为true。
我对启用WiFi时三个事件的解释如下:
所以,这对你来说有点多余,但这对于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}]发布于 2012-08-13 22:07:34
您可以检查作为额外发送的NetworkInfo。
这可能是因为它正在接收故障转移消息,正如文档中所描述的--当它第一次失败时,接收到该消息,然后再次成功地连接。
对于连接性的丢失,如果连接管理器试图连接(或已经连接)到另一个网络,则新网络的NetworkInfo也作为额外的。这让广播的任何接收者都知道,他们不一定应该告诉用户不可能有任何数据通信。相反,接收者应该期待不久的另一个广播,指示故障转移尝试成功(因此仍然存在总体数据连接),或者故障转移尝试失败,这意味着所有连接都丢失了。
https://stackoverflow.com/questions/11942933
复制相似问题