代码之家  ›  专栏  ›  技术社区  ›  CybeX

registerDefaultNetworkCallback和registerNetworkCallback之间的区别

  •  5
  • CybeX  · 技术社区  · 7 年前

    我偶然发现 registerDefaultNetworkCallback registerNetworkCallback 在为API 28更新我的Android应用程序时。

    查看了文档后,我找不到注册 网络回调 以及注册 违约 网络回调 .

    什么时候用哪个?

    提前感谢:)

    0 回复  |  直到 5 年前
        1
  •  27
  •   MihaiV    6 年前

    据我所知 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")
            }
        })
    

    在这里 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 可以通过设置其 capability transportType 。你可以在 NetworkRequest .

        2
  •  12
  •   xjcl    5 年前

    registerNetworkCallback() 是在API level 21(Android 5.0,棒棒糖)中添加的。它允许你倾听网络中满足特定需求的变化 运输类型 (无线、蜂窝、蓝牙等)和 能力 (短信、, 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对您很重要,我建议使用第一个版本。

        3
  •  6
  •   VadzimV    5 年前

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

    该设备可以同时连接到几个网络(例如WiFI和移动设备)。Android选择其中一个连接的网络作为 违约 因此 默认网络 用于请求。

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

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

    你可以找到一个很好的例子 on Android Developer 这就解释了你会收到哪些回电 registerDefaultNetworkCallback registerNetworkCallback

        4
  •  3
  •   Always Learning    5 年前

    这些答案大多或多或少是正确的。也就是说,我能补充的是 默认网络 在安卓系统中有一个特殊的含义,因此在命名上有所不同。默认网络适用于被选为“最佳”设备范围网络的任何网络。该网络将由 违约 任何连接请求。

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

    所以当你使用 registerDefaultNetworkCallback() ,你真正想说的是让我知道在被标记为设备上所有应用都将使用的“最佳”网络上发生的变化 默认情况下 除非他们提出不同的要求。这就是你不需要通过考试的原因 NetworkCapability 作为注册的一部分,因为默认网络由框架控制。

    registerNetworkCallback() 与此类似,只是它不关心默认网络。你给它一些 网络能力 您可以跟踪任何满足这些网络功能的网络,无论它们是否是默认的。

    你可以通过看 getDefaultNetwork() 在里面 ConnectivityService .

        5
  •  1
  •   xarlymg89 MiguelSlv    5 年前

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

    ConnectivityManager.registerDefaultNetworkCallback() 是在API 24(或26)中添加的,这取决于您是否沿着 Handler ).

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

        6
  •  1
  •   Yu Kakizaki    5 年前

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

    registerDefaultNetworkCallback , registerNetworkCallback default network 都解释过了。