24

在为 API 28 更新我的 Android 应用程序时,我遇到了registerDefaultNetworkCallbackregisterNetworkCallback 。

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

什么时候使用哪个?

提前致谢 :)

4

6 回答 6

27

据我了解,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")
        }
    })

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

这些只是一些非常基本的例子。当然NetworkRequest可以通过设置它的capabilityor来进行很多配置transportType您可以在NetworkRequest的官方文档中阅读有关这些的更多信息。

于 2019-05-19T09:23:27.513 回答
12

registerNetworkCallback()在 API 级别 21(Android 5.0、Lollipop)中添加。它允许您监听满足特定传输类型(WiFi、蜂窝、蓝牙……)和功能(SMS 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%)。由于我在其中找不到此 API 调用的向后兼容版本,因此ConnectivityManagerCompat如果 API 级别 21-23 对您很重要,我建议使用第一个版本。

于 2020-07-03T00:43:05.497 回答
6

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

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

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

这就是为什么你不能通过过滤器registerDefaultNetworkCallback- 过滤一个选择的默认网络没有意义,但它确实有意义,registerNetworkCallback因为可以有很多可用的网络

你可以在 Android Developer 上找到一个很好的例子,它解释了你进入了哪些回调registerDefaultNetworkCallbackregisterNetworkCallback

于 2020-12-16T16:44:14.180 回答
3

这些答案中的大多数或多或少是正确的。也就是说,我可以补充的是,默认网络在 Android 中具有特殊含义,因此在命名上有所不同。默认网络与被选为“最佳”设备范围网络的网络相关。默认情况下,此网络将用于任何连接请求。

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

因此,当您使用 时registerDefaultNetworkCallback(),您真正想说的是让我知道网络上发生的更改,这些更改标记为设备上所有应用程序默认使用的设备上的“最佳”网络,除非它们请求不同的东西。这就是为什么您不需要将 aNetworkCapability作为注册的一部分传递,因为默认网络由框架控制。

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

您可以通过查看ConnectivityServicegetDefaultNetwork()来了解更多信息。

于 2020-12-11T20:38:38.030 回答
1

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

registerDefaultNetworkCallback,registerNetworkCallbackdefault network进行了解释。

于 2020-12-10T14:37:50.707 回答
1

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

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

And ConnectivityManager.registerNetworkCallback()在 API 21(或 API 23,如果与NetworkRequest.

于 2019-12-13T17:44:38.240 回答