Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java registerDefaultNetworkCallback和registerNetworkCallback之间的区别_Java_Android_Kotlin_Network Programming_Android Connectivitymanager - Fatal编程技术网

Java registerDefaultNetworkCallback和registerNetworkCallback之间的区别

Java registerDefaultNetworkCallback和registerNetworkCallback之间的区别,java,android,kotlin,network-programming,android-connectivitymanager,Java,Android,Kotlin,Network Programming,Android Connectivitymanager,我在为API 28更新Android应用程序时遇到了一个问题 查看文档后,我找不到注册网络回调和注册默认网络回调之间的区别 什么时候用哪个 提前感谢:)据我所知,registerDefaultNetworkCallback和registerNetworkCallback之间的区别仅基于定制。 registerDefaultNetworkCallback作为默认网络侦听器工作(令人惊讶),而registerNetworkCallback更具可配置性。例如: val connectivity

我在为API 28更新Android应用程序时遇到了一个问题

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

什么时候用哪个


提前感谢:)

据我所知,
registerDefaultNetworkCallback
registerNetworkCallback
之间的区别仅基于定制。
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")
        }
    })
仅当用户连接到蜂窝网络(通过连接到WiFi,它不会记录任何内容)时,才会调用此处的
onAvailable
。断开与蜂窝网络的连接时,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
可以通过设置其
功能
传输类型
进行大量配置。据我所知,您可以在的官方文档中阅读更多关于这些的信息。

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

ConnectivityManager.registerDefaultNetworkCallback()
已添加到API 24中(或26中,具体取决于是否将其与
处理程序一起使用)


和ConnectivityManager.registerNetworkCallback()
被添加到API 21中(或者API 23,如果与
网络请求一起使用

registerNetworkCallback()
被添加到API级别21中(Android 5.0,棒棒糖)。它允许您监听满足特定传输类型(WiFi、蜂窝、蓝牙等)和功能(短信息,
非计量
,…)的网络变化

registerDefaultNetworkCallback()
是在API级别24(Android 7.0,Nougat)中添加的,当发生任何网络更改时,无论传输类型和功能如何,都会使用您的回调


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

/*建立internet连接后自动开始下载*/
val cm=getSystemService(Context.CONNECTIVITY_服务)作为ConnectionManager
//无法在生成器上使用.addCapability(int)或.addTransportType(int)进行筛选
val networkChangeFilter=NetworkRequest.Builder().build()
cm.registerNetworkCallback(网络更改过滤器,
对象:ConnectionManager.NetworkCallback(){
override fun onAvailable(网络:网络)=downloadStuff()
}
)
上述代码相当于此代码的registerDefaultNetworkCallback()

val cm=getSystemService(Context.CONNECTIVITY\u服务)作为ConnectionManager
cm.registerDefaultNetworkCallback(
对象:ConnectionManager.NetworkCallback(){
override fun onAvailable(网络:网络)=downloadStuff()
}
)
名称混乱的
NetworkRequest
实际上只是传输类型和功能的过滤器



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

我找到了指南文档页面:


registerDefaultNetworkCallback
registerNetworkCallback
默认网络
进行了解释。

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

如果您使用的是手机,并且只有手机连接可用,则这将是默认网络。但是,一旦您连接到Wi-Fi,这将成为默认网络,因为它被认为是“最佳”网络网络和所有未指定任何不同内容的连接请求现在默认情况下都将使用它,无论它们是否实现。这是因为只要Wi-Fi具有
网络功能,Wi-Fi就被认为比蜂窝网络更好。NET\u功能\u未计量
。现在,如果Wi-Fi网络实际上是一个计量网络如果没有,则默认网络将切换回蜂窝网络

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

registerNetworkCallback()
与之类似,只是它不关心默认网络。您可以为它提供一些
NetworkCapability
,并跟踪满足这些网络功能的任何网络,无论它们是否为默认网络


通过查看中的
getDefaultNetwork()
可以看到更多内容。

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

该设备可以是