奇怪的CONNECTIVITY_ACTION行为

时间:2012-08-13 21:57:08

标签: android broadcastreceiver intentfilter

这篇文章可能看起来很长......但它很简单。所以请帮忙。谢谢。

简而言之,每当连接从Wifi更改为移动时,我会在我的广播接收器中收到2次消息(第一次找不到网络)。当我从Mobile移动到Wifi时,我收到它三次。任何人都可以向我解释这种奇怪的行为。

我使用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");

        }       


            }
      };

我观察到以下行为。任何人都可以解释发生这种情况的原因。

最初我的设备已连接到Wifi。

APK现已部署在设备上。

我的Logcat条目是 D / MainActivity(32005):更改已发生变化 D / MainActivity(32005):连接到WIFI

这是可以理解的。

现在路由器已关闭。所以现在设备尝试连接到4G。 现在,Logcat条目如下。

D / MainActivity(32005):更改已发生变化 D / MainActivity(32005):更改已发生变化 D / MainActivity(32005):已连接到移动

可能这可以归因于第一个连接断开的事实,这导致打印CHANGE HAPPENED而不是消息“已连接到”。然后与Mobile建立连接,导致另一次更改发生连接到移动。

现在路由器再次打开。

但这次logcat报道, D / MainActivity(32005):改变发生

D / MainActivity(32005):已连接至WIFI

D / MainActivity(32005):改变发生

D / MainActivity(32005):已连接至WIFI

D / MainActivity(32005):改变发生

D / MainActivity(32005):已连接至WIFI

我无法理解为什么Logcat会三次报告此消息。任何人都可以帮助我理解这种行为。

这是我的manisfest档案。

<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 to Mobile: 1.网络信息为NULL 2. Netowrk Info对象存在且&#34;原因(networkInfo.getReason()&#34;是dataEnabled。

从手机到Wifi: 1.收到广播消息。 2. Netowrk Info对象存在且&#34; reason(networkInfo.getReason()&#34;是dataDisabled。 3.具有&#34;原因的NetworkInfo(networkInfo.getReason()&#34; as null

我的设备最初是在WIFI上使用的 我的Logcat

D / MainActivity(880):改变发生

D / MainActivity(880):已连接到:WIFI

D / MainActivity(880):NUMBER: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):reason:null

D / MainActivity(880):DONE

现在WIFI已关闭。所以现在我的设备进入MOBILE。以下是Logcat。

D / MainActivity(880):改变发生

D / MainActivity(880):改变发生

D / MainActivity(880):已连接到:移动

D / MainActivity(880):NUMBER:0

D / MainActivity(880):isConnectedOrConnecting:true

D / MainActivity(880):isConnected:true

D / MainActivity(880):isFailover:true

D / MainActivity(880):原因:dataEnabled

D / MainActivity(880):详细信息已连接

D / MainActivity(880):noConnectivity:false

D / MainActivity(880):reason:dataEnabled

D / MainActivity(880):DONE

现在我的WIFI已开启。我的设备回到Wifi。

D / MainActivity(880):改变发生

D / MainActivity(880):已连接到:WIFI

D / MainActivity(880):NUMBER: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):reason:null

D / MainActivity(880):DONE

D / MainActivity(880):改变发生

D / MainActivity(880):已连接到:WIFI

D / MainActivity(880):NUMBER: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):reason:dataDisabled

D / MainActivity(880):DONE

D / MainActivity(880):改变发生

D / MainActivity(880):已连接到:WIFI

D / MainActivity(880):NUMBER: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):reason:null

D / MainActivity(880):DONE

谢谢&amp;问候, Yuvi

2 个答案:

答案 0 :(得分:0)

好吧,你可以检查作为额外发送的NetworkInfo

它可能正在接收故障转移消息,如docs中所述 - 当它第一次失败时,收到消息然后再次成功连接。

  

如果连接管理器正在尝试连接丢失   连接(或已经连接)到另一个网络,   新网络的NetworkInfo也作为额外传递。这让我们   广播的任何接收者都知道他们不一定   告诉用户没有数据流量可行。相反,   接收者应该很快就会看到另一个广播,这表明要么   故障转移尝试成功(因此仍然存在整体数据   连接),或故障转移尝试失败,意味着所有   连接已经丢失。

答案 1 :(得分:0)

我认为如果您记录Extra内容,行为可能更有意义:

http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION

  

发生了网络连接的变化。已建立或丢失连接。受影响网络的NetworkInfo是作为额外发送的;应该查看是否发生了什么类型的连接事件。

     

如果这是从断开连接的网络故障转移的结果,则FAILOVER_CONNECTION布尔额外设置为true。

     

如果连接丢失,如果连接管理器尝试连接(或已连接)到另一个网络,则新网络的NetworkInfo也会作为额外网络传递。这使得广播的任何接收者都知道他们不一定会告诉用户没有数据流量是可能的。相反,接收方应该很快就会收到另一个广播,表明故障转移尝试成功(因此仍然存在整体数据连接),或者故障转移尝试失败,这意味着所有连接都已丢失。

     

对于断开连接事件,如果根本没有连接的网络,则布尔额外的EXTRA_NO_CONNECTIVITY设置为true。

我解释启用WiFi时三个事件的情况:

  1. 第一个事件只是通知您已启用WiFi。
  2. 第二个事件是通知您蜂窝网络连接 禁用,并有另一个可用的网络(WiFi)。这个 是具有NetworkInfo的事件。
  3. 这实际上是事件1的重复。每当与NetworkInfo发生断开连接的事件时,Android承诺它将跟进NetworkInfo中网络的连接成功/失败事件
  4. 所以,这对你来说有点多余,但这是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}]