ACTION意图在Wifi连接时收到两次

在我的应用程序中,我有一个BroadcastReceiver ,通过<receiver>标记作为组件启动,过滤android.net.conn.CONNECTIVITY_CHANGE意图。

我的目标是简单地知道什么时候建立了Wifi连接,所以我在onReceive()做的是这样的:

NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
    // Wifi is connected
}

它工作正常,但我似乎总是在建立Wifi连接时在约一秒内得到两个相同的意图。 我试图查看任何可以从intent, ConnectivityManagerWifiManager ,但我找不到任何区分这两种意图的信息。

查看日志,至少有另一个BroadcastReceiver也收到两个相同的意图。

它运行在Android 2.2上的HTC Desire上

任何想法为什么我似乎得到一个“重复”的意图,当Wifi连接或两者之间的差异可能是什么?


经过大量的搜索和调试,我相信这是确定Wifi是否连接或断开连接的正确方法。

BroadcastReceiver中的onReceive()方法:

public void onReceive(final Context context, final Intent intent) {

if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
    NetworkInfo networkInfo =
        intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
    if(networkInfo.isConnected()) {
        // Wifi is connected
        Log.d("Inetify", "Wifi is connected: " + String.valueOf(networkInfo));
    }
} else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
    NetworkInfo networkInfo =
        intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI &&
        ! networkInfo.isConnected()) {
        // Wifi is disconnected
        Log.d("Inetify", "Wifi is disconnected: " + String.valueOf(networkInfo));
    }
}
}

与AndroidManifest.xml中的以下接收器元素一起使用

<receiver android:name="ConnectivityActionReceiver"
    android:enabled="true" android:label="ConnectivityActionReceiver">
    <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        <action android:name="android.net.wifi.STATE_CHANGE"/>
    </intent-filter>
</receiver>

一些解释:

  • 当仅考虑ConnectivityManager.CONNECTIVITY_ACTION ,当Wifi连接时,我总是得到包含相同NetworkInfo实例的两个intent(getType()== TYPE_WIFI和isConnected()== true) - 此问题中描述的问题。

  • 当仅使用WifiManager.NETWORK_STATE_CHANGED_ACTION ,在Wifi断开连接时没有意图广播,但是包含不同NetworkInfo实例的两个意图允许在连接Wifi时确定一个事件。

  • 注意:我收到了一个崩溃报告(NPE),其中intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO)返回null。 所以,即使这种情况发生的可能性非常小,添加一个空检查可能是一个好主意。

    干杯,Torsten


    如果你正在监听WifiManager.NETWORK_STATE_CHANGED_ACTION你会收到两次,因为NetworkInfo有两种方法

  • isConnectedOrConnecting()
  • isConnected()
  • 第一次isConnectedOrConnecting()返回true并且isConnected() false
    第二次isConnectedOrConnecting()isConnected()返回true

    干杯


    如果您将活动注册为意向倾听者,那么您将收到相同的消息两次。 具体而言,您需要选择是否要在包级别(XML)或编程级别上进行监听。

    如果您为广播接收者设置了一个类并附加监听,并且您将一个意图过滤器附加到该活动,则该消息将被复制两次。

    我希望这能解决你的问题。

    链接地址: http://www.djcxy.com/p/59935.html

    上一篇: ACTION intent received twice when Wifi connected

    下一篇: Problem connecting Android app to socket using cell connection