registerDefaultNetworkCallback 和 registerNetworkCallback 的区别

Difference between registerDefaultNetworkCallback and registerNetworkCallback

我在为 API 28 更新我的 Android 应用程序时遇到 registerDefaultNetworkCallback and registerNetworkCallback

查看文档后,我找不到注册 网络回调 和注册 default 网络之间的区别回调.

什么时候用哪个?

提前致谢:)

据我了解,registerDefaultNetworkCallbackregisterNetworkCallback之间的区别只是基于定制。
registerDefaultNetworkCallback 作为默认网络侦听器工作(令人惊讶),而 registerNetworkCallback 它更易于配置。例如:

    val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val builder = NetworkRequest.Builder()
    builder.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)

    val networkRequest = builder.build()
    connectivityManager.registerNetworkCallback(networkRequest, 
    object : ConnectivityManager.NetworkCallback () {
        override fun onAvailable(network: Network?) {
            super.onAvailable(network)
            Log.i("Test", "Network Available")
        }

        override fun onLost(network: Network?) {
            super.onLost(network)
            Log.i("Test", "Connection lost")
        }
    })

此处 onAvailable 仅当用户连接到蜂窝网络时才会被调用(通过连接到 WiFi,它不会记录任何内容)。 onLost 与蜂窝网络断开连接时也是如此。

如果我们这样做:

    connectivityManager.registerDefaultNetworkCallback(object  : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network?) {
            super.onAvailable(network)
            Log.i("Test", "Default -> Network Available")
        }

        override fun onLost(network: Network?) {
            super.onLost(network)
            Log.i("Test", "Default -> Connection lost")
        }
    })

当用户连接(或断开连接)to/from 网络(可以是 WiFi 或蜂窝网络)时,这两个函数都用作默认回调。

这些只是一些非常基本的例子。当然NetworkRequest可以通过设置它的capability或者transportType来进行很多配置。您可以在 NetworkRequest.

的官方文档中阅读更多相关信息

据我了解,除了@MihaiV 提供的信息外,它们之间还有另一个区别。

ConnectivityManager.registerDefaultNetworkCallback() 已添加到 API 24(或 26,取决于您是否在 Handler 中使用它)。

And ConnectivityManager.registerNetworkCallback() 已添加到 API 21(或 API 23,如果与 NetworkRequest.

一起使用

registerNetworkCallback() 已添加到 API 级别 21(Android 5.0,Lollipop)。它允许您监听满足特定传输类型(WiFi、蜂窝、蓝牙...)和能力(短信, NOT_METERED, ...).

registerDefaultNetworkCallback() 已添加到 API 级别 24(Android 7.0,Nougat)并在发生任何网络更改时使用您的回调,无论传输类型和能力如何。


registerNetworkCallback() 的示例。至少在我的情况下,我不关心过滤器,并希望我的代码对任何网络类型都为 运行。这可以通过一个空的 Builder 对象来实现:

/* Automatically start a download once an internet connection is established */
val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
// could filter using .addCapability(int) or .addTransportType(int) on Builder
val networkChangeFilter = NetworkRequest.Builder().build()
cm.registerNetworkCallback(networkChangeFilter, 
    object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) = downloadStuff()
    }
)

以上代码等同于此代码 registerDefaultNetworkCallback():

val cm = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
cm.registerDefaultNetworkCallback(
    object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) = downloadStuff()
    }
)

名称容易混淆的 NetworkRequest 实际上只是传输类型和功能的过滤器。


Default 版本代码较少,但 API 级别较低,因此支持的手机较少(74% 对 94%)。 自我在 ConnectivityManagerCompat 中找不到此 API 调用的向后兼容版本 如果 API 级别 21-23 对您很重要,我建议使用第一个版本。

我找到了指南文档页面: Android Developers > Docs > Guides > Reading network state.

registerDefaultNetworkCallback , registerNetworkCallbackdefault network 都有解释。

这些答案中的大多数或多或少是正确的。也就是说,我可以补充的是 default network 在 Android 中具有特殊含义,因此命名存在差异。默认网络属于被选为“最佳”设备范围网络的网络。 默认 将使用此网络来处理任何连接请求。

如果您使用的是 phone 并且只有蜂窝网络连接可用,那将是默认网络。一旦连接到 Wi-Fi,它将成为默认网络,因为它被认为是“最佳”网络,所有未指定任何不同内容的连接请求现在将默认使用它 不管他们是否意识到。这是因为只要 Wi-Fi NetworkCapability.NET_CAPABILITY_NOT_METERED,Wi-Fi 就被认为比蜂窝网络更好。现在,如果事实证明 Wi-Fi 网络实际上是按流量计费的网络而蜂窝网络不是,那么默认网络将切换回蜂窝网络。

因此,当您使用 registerDefaultNetworkCallback() 时,您真正想说的是让我知道在所有应用程序都将使用的设备上标记为“最佳”网络的网络上发生的变化 默认 除非他们要求不同的东西。这就是为什么您不需要在注册过程中传递 NetworkCapability 的原因,因为默认网络由框架控制。

registerNetworkCallback() 类似,只是它不关心默认网络。你给它一些 NetworkCapability 然后你跟踪任何满足这些网络能力的网络,不管它们是否是默认的。

您可以查看 ConnectivityService 中的 getDefaultNetwork() 了解更多信息。

始终学习突出了最重要的区别。我的答案是一样的,但我会尝试用不同的方式解释它。

设备可以同时连接到几个网络(例如 WiFI 和移动网络)。 Android 选择连接的网络之一作为 默认 以便 默认网络 用于请求。

不同之处在于 registerNetworkCallback 通知 所有连接的网络 ,而 registerDefaultNetworkCallback 通知 默认网络

这就是为什么你不能在 registerDefaultNetworkCallback 中传递过滤器 - 过滤一个选定的默认网络没有意义,但它对 registerNetworkCallback 有意义因为可以有很多可用网络.

你可以找到一个很好的例子 on Android Developer 来解释你在 registerDefaultNetworkCallbackregisterNetworkCallback

中得到了哪些回调