无法理解CONNECTIVITY_ACTION附加功能

时间:2011-03-24 19:26:55

标签: android

要收到网络连接和断开连接的通知,然后知道我的应用程序是否可以连接到互联网,我会注册一个ConnectionManager.CONNECTIVITY_ACTION接收者。目前,我检查手机是否有这样的活动网络连接:

if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) {
    // no connection!
} else {
    NetworkInfo activeNetInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
    if (activeNetInfo != null && activeNetInfo.isConnectedOrConnecting()) {
        // active connection!
    } else {
        // no connection!
    } 
}

但是,我认为我做错了,因为我的应用有时会错误地报告手机的连接状态。阅读EXTRA_NETWORK_INFO的文档,似乎表明如果为此额外返回的值为null,则表示没有连接:“...如果连接管理器正在尝试连接(或已连接)另一个网络,新网络的NetworkInfo也作为额外的传递“(http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION)。

然而,在我的应用程序误报连接的情况下,就在接收CONNECTIVITY_ACTION广播之前,getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo()返回NetworkInfo检查返回true的isConnectedOrConnecting()对象。因此,手机似乎已连接,但通过NetworkInfo返回的CONNECTIVITY_BROADCAST为空。

我的CONNECTIVITY_ACTION收件人代码中我做错了什么?我应该不检查EXTRA_NETWORK_INFO)的值吗?我可以简单地依靠EXTRA_NO_CONNECTIVITY吗?

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你没有做错任何事,但来自isConnectedOrConnecting的唯一可靠值是假的。

即使该方法返回true,也无法保证您能够连接到网络。

当Android报告您实际上有活动连接时,您需要实现某种重试机制,以防连接似乎不可行。

例如,当连接到公司WIFI网络时,可能就是这种情况,所有请求最终都会重定向到公司登录页面。 Android告诉您,您有一个活动的网络,但您的查询显然会失败。

但是,即使有直接的网络连接,如果没有某种重试机制,当出现问题时,依赖它来返回true也不是一个好主意。

另一方面,当方法返回false时,保证不会有网络连接。