首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的CONNECTIVITY_ACTION行为

奇怪的CONNECTIVITY_ACTION行为
EN

Stack Overflow用户
提问于 2012-08-13 21:57:07
回答 2查看 3.8K关注 0票数 2

这个职位似乎很长..。但这很简单。所以请帮帮忙。谢谢。

简而言之,每当从Wifi到Mobile的连接性发生变化时,我就会在我的广播接收器中接收到一条消息2次(第一次没有找到网络)。当我从Mobile搬到Wifi时,我收到了三次。有谁能解释一下我这种奇怪的行为吗?

我使用IntentFilterConnectivityManager.CONNECTIVITY_ACTION)实现了一个代码,并将其注册到我的接收器中。

新IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);= IntentFilter mNetworkStateFilter

代码语言:javascript
复制
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

我不明白为什么逻辑猫三次报告这个消息。有人能帮我理解一下这种行为吗。

这是我的指甲锉。

代码语言:javascript
复制
<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):已完成

谢谢和问候,尤维

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-13 22:08:10

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

动作

网络连接发生了变化。连接已经建立或丢失。受影响网络的NetworkInfo作为额外发送;应该咨询它以查看发生了什么样的连接事件。 如果这是一个连接失败的结果从一个断开的网络,那么FAILOVER_CONNECTION布尔额外设置为真。 对于连接性的丢失,如果连接管理器试图连接(或已经连接)到另一个网络,则新网络的NetworkInfo也作为额外的。这让广播的任何接收者都知道,他们不一定应该告诉用户不可能有任何数据通信。相反,接收者应该期待不久的另一个广播,指示故障转移尝试成功(因此仍然存在总体数据连接),或者故障转移尝试失败,这意味着所有连接都丢失了。 对于断开事件,如果根本没有连接的网络,则布尔额外的EXTRA_NO_CONNECTIVITY设置为true。

我对启用WiFi时三个事件的解释如下:

  1. 第一个事件只是简单地通知您启用了WiFi。
  2. 第二个事件是通知您蜂窝网络连接已禁用,并且存在另一个可用网络(WiFi)。这是具有NetworkInfo的事件。
  3. 这实质上是事件1的重复。每当一个断开连接的事件发生在NetworkInfo上时,Android承诺它将跟踪NetworkInfo中网络的连接成功/失败事件。

所以,这对你来说有点多余,但这对于Android来说是正常的行为。以下是我实验中的一些日志:

代码语言:javascript
复制
    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}]
票数 0
EN

Stack Overflow用户

发布于 2012-08-13 22:07:34

您可以检查作为额外发送的NetworkInfo

这可能是因为它正在接收故障转移消息,正如文档中所描述的--当它第一次失败时,接收到该消息,然后再次成功地连接。

对于连接性的丢失,如果连接管理器试图连接(或已经连接)到另一个网络,则新网络的NetworkInfo也作为额外的。这让广播的任何接收者都知道,他们不一定应该告诉用户不可能有任何数据通信。相反,接收者应该期待不久的另一个广播,指示故障转移尝试成功(因此仍然存在总体数据连接),或者故障转移尝试失败,这意味着所有连接都丢失了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11942933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档