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 测试。
