Wear OS 上的网络访问和同步

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

有了 Wear OS by Google 谷歌,手表可以直接与网络通信,无需访问 Android 或 iOS 手机。您不应使用 Data Layer API 连接到网络。

网络访问

Wear OS 应用可以发出网络请求。当手表通过蓝牙连接到手机时,手表的网络流量通常由手机代理。

当手机不可用时,会使用 Wi-Fi 和移动数据网络,具体取决于手表硬件。Wear OS 平台可处理网络之间的转换。

您可以使用 HTTP、TCP 和 UDP 等协议。不过,不能使用 android.webkit API(包括 CookieManager 类)。您可以通过读取和写入请求和响应的标头来使用 Cookie。

我们还建议使用 WorkManager API 调度异步请求,包括定期轮询。

如果您需要连接到特定网络类型,请参阅读取网络状态

高带宽网络访问

Wear OS 平台管理网络连接的目标是提供出色的整体用户体验。该平台通过平衡以下两个因素来选择默认活动网络:

  • 对较长电池续航时间的需求。
  • 对网络带宽的需求。

当优先考虑节省电池电量时,活动网络可能没有足够的带宽来执行需要高带宽的网络任务,如传输大型文件或在线播放媒体内容。

本部分将指导您使用 ConnectivityManager 类来确保为您的应用提供必需的网络带宽。如需了解对网络资源进行精细控制的常规信息,请参阅管理网络使用情况

请求 Wi-Fi 连接

对于需要高带宽网络访问的用例,如传输大型文件或在线播放媒体内容,可以请求与 Wi-Fi 等高带宽传输网络连接。

Kotlin

val callback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
        // The Wi-Fi network has been acquired, bind it to use this network by default
        connectivityManager.bindProcessToNetwork(network)
    }

    override fun onLost(network: Network) {
        super.onLost(network)
        // The Wi-Fi network has been disconnected
    }
}
connectivityManager.requestNetwork(
    NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(),
    callback
)

Java

ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
    public void onAvailable(Network network) {
        super.onAvailable(network);
        // The Wi-Fi network has been acquired, bind it to use this network by default
        connectivityManager.bindProcessToNetwork(network);
    }

    public void onLost(Network network) {
        super.onLost(network);
        // The Wi-Fi network has been disconnected
    }
};
connectivityManager.requestNetwork(
        new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(),
        callback
);

由于手表的 Wi-Fi 或手机无线装置可能为节省电池电量而处于关闭状态,因此可能无法瞬间获取网络。此外,如果手表无法连接到网络,就不会调用 NetworkCallback 实例的 onAvailable() 方法。

调用 onAvailable() 后,设备会尝试仍然连接到 Wi-Fi 网络,直到 NetworkCallback 被释放。当您不再需要 Wi-Fi 网络时,请释放该回调以延长电池续航时间。

Kotlin

connectivityManager.bindProcessToNetwork(null)
connectivityManager.unregisterNetworkCallback(callback)

Java

connectivityManager.bindProcessToNetwork(null);
connectivityManager.unregisterNetworkCallback(callback);

启动 Wi-Fi 设置 activity

请求 Wi-Fi 网络时,如果已配置保存的网络且该网络在覆盖范围之内,系统会尝试连接到该网络。不过,如果没有保存的 Wi-Fi 网络可用,就不会调用 NetworkCallback 实例的 onAvailable() 回调方法。

如果您使用 Handler 将网络请求设置为超时,在发生超时后,您可以引导用户添加 Wi-Fi 网络。请使用以下 intent 直接将用户带到用于添加 Wi-Fi 网络的 activity:

Kotlin

context.startActivity(Intent("com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"))

Java

context.startActivity(new Intent("com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"));

如需启动设置 Activity,您的应用必须具有以下权限:android.permission.CHANGE_WIFI_STATE

界面注意事项

如果您的应用需要连接到新的 Wi-Fi 网络以进行高带宽操作,请确保在启动 Wi-Fi 设置之前先向用户清晰阐明连接的原因。只有在需要高带宽网络时,才要求用户添加新的 Wi-Fi 网络。请勿阻止用户访问不需要高带宽网络的应用功能。

图 1 显示了一款音乐应用。该应用应允许用户浏览音乐,并且只有在用户需要下载或在线播放音乐时,才要求用户添加新的 Wi-Fi 网络。

音乐下载

图 1. 用于下载音乐的音乐应用流程。

云消息传递

如需发送通知,应用可以直接使用 Firebase Cloud Messaging (FCM)

没有专用于 Wear OS 的网络访问 API 或 FCM API。请参阅有关连接到网络云消息传递的现有文档。

FCM 可与低电耗模式很好地搭配使用,因此我们建议您采用这种方式将通知发送到手表。

当您的 Wear OS 应用运行时,请收集设备的注册令牌,通过 FCM 提供消息。然后,当服务器将消息发送到 FCM REST 端点时,将令牌作为目标的一部分包括在内。FCM 会将消息发送到由令牌标识的设备。

FCM 消息采用 JSON 格式,并且可以包含以下两种或其中一种负载:

  • 通知负载。当手表收到通知负载时,将直接在通知流中向用户显示数据。当用户点按通知时,将启动您的应用。
  • 数据负载。该负载具有一组自定义键值对。该负载将作为数据传送到您的 Wear OS 应用。

如需了解负载详情和示例,请参阅关于 FCM 消息

默认情况下,通知会从手机应用桥接(共享)到手表。如果您有独立的 Wear OS 应用和对应的手机应用,可能会出现重复的通知。例如,如果手机和手表收到了通过 FCM 传递的同一通知,这两部设备可能会独立地显示该通知。您可以使用桥接 API 防止这种情况。

使用后台服务

为了确保后台任务得到正确执行,必须考虑低电耗模式和应用待机模式。

当屏幕关闭或进入氛围模式的时间足够长时,设备会在一定的时间段内部分进入低电耗模式,且后台任务可能会延迟。之后,如果设备长时间处于静止状态,将进入常规低电耗模式。您应使用 WorkManager API 来调度请求,您的应用可通过它注册在低电耗模式下安全执行代码。

使用约束条件进行调度

您可以使用约束条件,以延长电池续航时间的方式配置请求。请选择以下一个或多个约束条件,将其添加到您的请求中:

  • 调度需要网络的请求。指定 NetworkTypeCONNECTED 还是 UNMETEREDUNMETERED 适用于大型数据传输,而 CONNECTED 适用于小型数据传输。
  • 调度在设备充电时发出请求。
  • 调度在设备处于闲置状态时发出请求。此约束条件对于优先级较低的后台工作或同步很有用,尤其是在设备充电时。

请注意,Bluetooth LE 等一些低带宽网络被视为按流量计费的网络。

如需了解详情,请查看 WorkManager 的约束对定期工作的影响指南。