使用 NetworkCapabilities 和 ConnectivityManagerCompat 确定网络是否按流量计费有什么区别?
What's the difference between determining if a network is metered using NetworkCapabilities and ConnectivityManagerCompat?
我发现有两种方法可以检测当前网络是否被计费:
- 与
NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)
NetworkCapabilities
- 与
ConnectivityManagerCompat.isActiveNetworkMetered
ConnectivityManagerCompat
那么,这些方法有什么区别呢?什么时候使用它们?
首先:ConnectivityManagerCompat.isActiveNetworkMetered
只是框架 ConnectivityManager.isActiveNetworkMetered
的 androidx
backport。
在有该方法的平台上(API 16+),兼容版本直接调用框架方法。否则,它 tries to guess based on the connection type:假定 Wi-Fi、蓝牙和以太网连接是非计量的,而其他任何连接都假定是计量的。这个猜测不一定正确(例如,可以对 Wi-Fi 网络进行计量),但这是您在 API 水平上可以做出的最佳猜测。你应该在(现在不太可能)需要定位 API 15 或以下的情况下使用它。
就 ConnectivityManager.isActiveNetworkMetered
和 NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)
之间的区别而言:对于活动数据网络,它们完全相同,因为 implementation 只是调用了那个确切的方法。
但是,因为 hasCapability
可以在 任何 网络上调用,所以如果您想要活动数据网络以外的网络功能,它会为您提供更大的灵活性。
我发现有两种方法可以检测当前网络是否被计费:
- 与
NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)
NetworkCapabilities - 与
ConnectivityManagerCompat.isActiveNetworkMetered
ConnectivityManagerCompat
那么,这些方法有什么区别呢?什么时候使用它们?
首先:ConnectivityManagerCompat.isActiveNetworkMetered
只是框架 ConnectivityManager.isActiveNetworkMetered
的 androidx
backport。
在有该方法的平台上(API 16+),兼容版本直接调用框架方法。否则,它 tries to guess based on the connection type:假定 Wi-Fi、蓝牙和以太网连接是非计量的,而其他任何连接都假定是计量的。这个猜测不一定正确(例如,可以对 Wi-Fi 网络进行计量),但这是您在 API 水平上可以做出的最佳猜测。你应该在(现在不太可能)需要定位 API 15 或以下的情况下使用它。
就 ConnectivityManager.isActiveNetworkMetered
和 NetworkCapabilities.hasCapability(NET_CAPABILITY_NOT_METERED)
之间的区别而言:对于活动数据网络,它们完全相同,因为 implementation 只是调用了那个确切的方法。
但是,因为 hasCapability
可以在 任何 网络上调用,所以如果您想要活动数据网络以外的网络功能,它会为您提供更大的灵活性。