Broadcast Receiver调用两次



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

    <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

所以,接收器被调用了两次。为什么?所有类型的连接都有问题

你可能还需要通过检查你的接收器中的isStickyBroadcast来检查被接收的意图是否是一个Sticky事件。如果这是真的,那么你可以忽略它,继续前进。一旦接收方注册,您将获得粘性广播。

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

文档说明:

"设备连接的变化可能非常频繁 -每次在移动数据和Wi-Fi之间移动时都会触发此广播。因此,只有在您先前暂停更新或下载以便恢复它们时才监视此广播是一种好做法。通常,在开始更新之前简单地检查互联网连接就足够了,如果没有,则暂停进一步的更新,直到连接恢复。"

编辑:忘了加上……一个只知道设备是否连接的广播接收器有点像一个悬顶。从相同的文档:

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;

最新更新