Android 理解连接和动作附加的问题

Android 理解连接和动作附加的问题,android,Android,为了得到网络连接和断开连接的通知,然后知道我的应用程序是否可以连接到internet,我注册了一个ConnectionManager.CONNECTIVITY\u ACTION接收器。目前,我检查手机是否有如下活动网络连接: if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) { // no connection! } else { NetworkInfo activeNetI

为了得到网络连接和断开连接的通知,然后知道我的应用程序是否可以连接到internet,我注册了一个
ConnectionManager.CONNECTIVITY\u 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\u NETWORK\u INFO
的文档时,似乎表明如果为此EXTRA返回的值为null,则表示没有连接:“……如果连接管理器正在尝试连接(或已经连接)到另一个网络,则新网络的NetworkInfo也会作为EXTRA传递”(http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION)

但是,在我的应用程序误报连接的情况下,就在接收到
connectivity\u操作
广播之前,
getSystemService(Context.connectivity\u SERVICE)).getActiveNetworkInfo()返回一个
NetworkInfo
对象,该对象的
isConnectedOrConnecting()
检查返回true。因此,手机似乎已连接,但通过
CONNECTIVITY\u广播返回的
NetworkInfo
为空

我的
CONNECTIVITY\u操作
receiver code有什么错?我是否应该检查
EXTRA\u NETWORK\u INFO)
的值?我可以简单地依靠
额外的\u NO \u连接吗


感谢您的帮助

您没有做错任何事情,但是isConnectedOrConnecting唯一可靠的值是false

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

当Android报告说您实际上有一个活动连接时,您需要实现某种重试机制,以防连接看起来不可行

例如,当连接到公司WIFI网络时,所有请求都会重定向到公司登录页面。Android告诉你你有一个活跃的网络,但是你的查询显然会失败

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


另一方面,当该方法返回false时,可以保证您没有网络连接。

如果我应该只信任isConnectedOrConnecting()的返回,那么如果在我的CONNECTIVITY\u ACTION receiver中,如果额外的\u network\u信息为null,我是否应该假设存在活动的网络连接?您应该只在以下情况下信任它!activeNetInfo.isConnectionedorConnection()或当activeNetInfo==null时。此时,您可以100%确定没有网络连接。如果返回true,则表示您知道正在建立连接,但是,为了确保与某个特定主机的实际网络连接,您需要自己执行检查,或为网络呼叫执行重试算法。我理解您的观点,但我认为在我的特定情况下,我的“已断开连接”检查结果为真,因为我误解了广播的文档:“对于连接丢失,如果连接管理器正在尝试连接(或已经连接)到另一个网络,则新网络的NetworkInfo也会作为额外信息传递。”这似乎表明,如果手机没有失去连接,而是获得了连接,则不会发送此额外信息。
extra\u NETWORK\u INFO
不推荐使用getActiveNetworkInfo()或getAllNetworkInfo()。