android - 无法理解 CONNECTIVITY_ACTION 附加功能

标签 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 的文档,它似乎表明如果为这个 extra 返回的值为空,则没有连接:“......如果连接管理器正在尝试连接(或已经连接)到另一个网络,新网络的 NetworkInfo 也作为额外传递”(http://developer.android.com/reference/android/net/ConnectivityManager.html#CONNECTIVITY_ACTION)。

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

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

感谢任何帮助!

最佳答案

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

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

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

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

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

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

关于android - 无法理解 CONNECTIVITY_ACTION 附加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5424435/

相关文章:

android - 有没有可能通过 Android Studio 在适用于 Android 的 Windows 子系统上运行 Android 应用程序?

Android Gradle 从 apk 中删除资源

android - 一种在 RxJava 中定义订阅者顺序的方法?

java - Android 使用 Java 更改 Seekbar Thumb 会导致 Thumb 位置重置

android - 意外的顶级异常 Google Play 服务

java - 如何在Android中检索特定的列?

android - SavedInstanceState 不为空但为空

Android ListView 计时器每秒运行一次

java.lang.UnsatisfiedLinkError : Native method not found in Android 错误

android - 写入嵌套字典 (Kotlin)