11

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

    <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

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

4

3 回答 3

3

假设您在连接 wifi 时收到已连接的消息,我猜第一个是正确的,而其他 2 个只是出于某种原因的回声。

要知道消息已被调用,您可以有一个静态布尔值,它在连接和断开之间切换,并且仅在您收到连接并且布尔值为真时才调用您的子例程。就像是:

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 事件

于 2013-09-16T09:26:05.983 回答
1

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

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

于 2014-12-15T19:37:00.650 回答
0

在文档中解释:

"设备连接的更改可能非常频繁— 每次您在移动数据和 Wi-Fi 之间移动时都会触发此广播。因此,最好仅在您之前暂停更新或下载时才监控此广播恢复它们。在开始更新之前简单地检查 Internet 连接通常就足够了,如果没有,则暂停进一步的更新,直到连接恢复。

编辑:忘记添加......广播接收器只知道设备是否已连接有点悬停。来自相同的文档:

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;
于 2014-12-15T19:52:14.127 回答