广播接收器叫了两次

时间:2013-04-11 20:29:07

标签: android connection broadcastreceiver

尝试在我的应用中检查互联网连接。 我的清单有一个代码:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <receiver android:name=".MyReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
        </intent-filter>
    </receiver>

还有一个句柄类:

public class MyReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    if(intent.getAction() != null && intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE"));
    {
        Log.d("myLogs", "Network connectivity change");
        if (intent.getExtras() != null) {
            NetworkInfo ni = (NetworkInfo) intent.getExtras().get(
                    ConnectivityManager.EXTRA_NETWORK_INFO);
            if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
                Log.i("myLogs", "Network " + ni.getTypeName() + " connected");
            }
        }
        if (intent.getExtras().getBoolean(
                ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) {
            Log.d("myLogs", "There's no network connectivity");
        }
    }
}

}

在我的Logcat中我得到一张如下照片:

04-11 23:24:48.021: D/myLogs(10261): Network connectivity change
04-11 23:24:48.021: I/myLogs(10261): Network WIFI connected
04-11 23:24:48.202: D/myLogs(10261): Network connectivity change
04-11 23:24:48.202: I/myLogs(10261): Network WIFI connected

所以,接收者叫了两次。为什么?所有类型的连接都存在一些问题。

3 个答案:

答案 0 :(得分:3)

假设你在连接wifi时得到连接的消息,我猜第一个是正确的,另外两个只是因为某种原因的回声。

要知道消息已被调用,你可以有一个静态布尔值,它在connect和disconnect之间切换,只在你收到一个连接并且boolean为true时调用你的子例程。类似的东西:

public class ConnectionChangeReceiver extends BroadcastReceiver {
    private static boolean firstConnect = true;

    @Override
    public void onReceive(Context context, Intent intent) {
        final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        final NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetInfo != null) {
            if(firstConnect) { 
                // do subroutines here
                firstConnect = false;
            }
        }
        else {
            firstConnect= true;
        }
    }
}
  

请注意

您需要注意两件事。首先 - 在某处存储“firstConnect”,例如在共享首选项中存储,其次是当您从3G更改为WiFi时,没有实际断开连接,因此最好分别处理3G和WiFi事件

答案 1 :(得分:1)

您可能还需要通过检查接收方中的isStickyBroadcast来检查收到的意图是否是Sticky事件之一。如果这是真的,那么你可以忽略它,然后继续。一旦接收者注册,你就会收到粘性广播。

http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast%28%29

答案 2 :(得分:0)

在文档中解释:

&#34; 对设备连接的更改可能非常频繁 - 每次在移动数据和Wi-Fi之间切换时都会触发此广播。因此,只有在您之前暂停更新或下载才能恢复此广播时,才能监控此广播。在开始更新之前,通常只需检查Internet连接即可,如果没有,则暂停进一步更新,直到连接恢复为止。&#34;

编辑: 忘了添加...一个广播接收器只知道设备是否连接是一个hoverhead。来自相同的文档:

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting();
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;