registerDefaultNetworkCallback和registerNetworkCallback之间的区别

KGC*_*beX 10 android network-programming callback android-connectivitymanager

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

审阅了文档后,我找不到注册网络回调和注册默认 网络回调之间的区别.

什么时候会用哪个?

提前致谢 :)

Mih*_*aiV 24

据我了解,它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")
        }
    })
Run Code Online (Sandbox Code Playgroud)

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")
        }
    })
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,`onAvailable` 不会在主线程中发生,因此任何 UI 更新都需要位于 `runOnUiThread { /* code */ }` 块内。 (6认同)

xjc*_*jcl 9

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()
    }
)
Run Code Online (Sandbox Code Playgroud)

上面的代码等效于以下代码registerDefaultNetworkCallback()

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

令人困惑的命名NetworkRequest实际上只是传输类型和功能的过滤器。


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


Vad*_*imV 7

最重要的区别是不断学习。我的答案是一样的,但我会尝试以不同的方式解释它。

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

区别在于registerNetworkCallback通知所有连接的网络registerDefaultNetworkCallback通知默认网络

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

您可以在 Android Developer 上找到一个非常好的示例,它解释了您会进入哪些回调registerDefaultNetworkCallback以及registerNetworkCallback