Connectivity Diagnostics API 允许拥有或管理网络的应用(例如,运营商应用、VPN 应用和 Wi-Fi 建议应用)从框架接收网络连接诊断信息。这些应用可以注册回调,并接收有关其拥有或管理的网络的连接信息的通知。应用不会接收有关非该应用拥有或管理的网络的通知。
以下是管理或拥有网络的应用的示例:
- 运营商应用:管理其
subId
具有运营商权限的移动网络 - Wi-Fi 建议应用:拥有其向系统建议的 Wi-Fi 网络
- VPN 应用:管理其 VPN 使用的所有网络,但仅限于处于活动状态的 VPN
在以下情况下会调用回调:
网络验证:系统已完成对特定网络的评估。
ConnectivityReport
类可提供以下方面的信息:当前网络状态以及在验证过程中执行的任何测试或流程的结果。public class ConnectivityReport { Network network; long reportTimestamp; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle additionalInfo; }
可疑数据失速:系统会怀疑存在数据失速,即 IP 数据包无法正常流经网络的情况。
DataStallReport
类可提供有关疑似数据失速的信息。public class DataStallReport { Network network; long reportTimestamp; int detectionMethod; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle stallDetails; }
报告的连接:应用已通过
ConnectivityManager#reportNetworkConnectivity
向系统报告连接。已共享网络和报告的连接(无论应用认为该网络是否提供连接)。
实现
如需使用 Connectivity Diagnostics API,应用必须从平台获取 ConnectivityDiagnosticsManager
实例。此实例应该用于注册和取消注册 ConnectivityDiagnosticsCallback
实现。未被替换的回调方法为空操作。
以下是 ConnectivityDiagnosticsCallback
实现的示例:
public class ExampleCallback extends ConnectivityDiagnosticsCallback {
@Override
public void onConnectivityReportAvailable(@NonNull ConnectivityReport report) {
...
// Log data, take action based on report result, etc
...
}
@Override
public void onDataStallSuspected(@NonNull DataStallReport report) {
...
// Log data, take action based on report result, etc
...
}
@Override
public void onNetworkConnectivityReported(
@NonNull Network network, boolean hasConnectivity) {
...
// Log data, take action based on report result, etc
...
}
}
如需注册回调并接收通知,请调用 registerConnectivityDiagnosticsCallback
。如需取消注册回调并停止接收通知,请调用 unregisterConnectivityDiagnosticsCallback
。
以下是注册和取消注册 ConnectivityDiagnosticsCallback
的示例:
NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(TRANSPORT_CELLULAR)
.build();
// Use an Executor that is appropriate for your use case
Executor executor = Executors.newSingleThreadExecutor();
ConnectivityDiagnosticsManager cdm =
context.getSystemService(ConnectivityDiagnosticsManager.class);
ExampleCallback callback = new ExampleCallback();
cdm.registerConnectivityDiagnosticsCallback(
request, executor, callback);
...
// Collect connectivity information on networks that match with request
...
cdm.unregisterConnectivityDiagnosticsCallback(callback);
验证
Connectivity Diagnostics API 已由 ConnectivityDiagnosticsManagerTest
进行 CTS 测试。