在独立设备上通过网络直接通信

借助 Google Wear OS,手表可以直接与网络通信,无需访问 Android 或 iOS 手机。请勿使用 Data Layer API 将 Wear OS 应用连接到网络。请遵循本指南中的准则和步骤。

网络访问

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

当手机不可用时,会根据手表硬件使用 Wi-Fi 和蜂窝网络。Wear OS 平台会处理网络之间的转换。

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

使用 WorkManager 进行异步请求,包括定期轮询。

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

高带宽网络访问

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)
        // Called when a network disconnects or otherwise no longer satisfies this request or callback.
    }
}
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);
        // Called when a network disconnects or otherwise no longer satisfies this request or callback.
    }
};
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 设置活动

请求 Wi-Fi 网络时,如果已配置并处于范围内,系统会尝试连接到已保存的网络。如果没有可用的已保存 Wi-Fi 网络,则不会调用您的 NetworkCallback 实例的 onAvailable 回调方法。

如果您使用 Handler 来设置网络请求超时,则可以在超时发生时引导用户添加 Wi-Fi 网络。使用以下 intent 直接将用户发送到添加 Wi-Fi 网络的活动:

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"));

要启动设置活动,您的应用必须具有 CHANGE_WIFI_STATE 权限。

用户界面注意事项

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

图 1 显示了一个音乐应用。该应用允许用户在低带宽网络上浏览音乐,并且仅在用户想要下载或流式传输音乐时才要求用户添加新的 Wi-Fi 网络。

Music downloading

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

电量和数据使用注意事项

为了帮助延长电池续航时间并最大限度地减少移动数据使用,请将任何非必要的网络任务(例如分析报告或日志收集)推迟到 Wear OS 设备重新建立蓝牙或 Wi-Fi 连接之后,而不是使用 LTE 或按流量计费的连接。

云消息传递

对于发送通知,请直接使用 Firebase Cloud Messaging (FCM)

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

FCM 与 低电耗模式配合良好,是向手表发送通知的推荐方式。

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

FCM 消息采用 JavaScript Object Notation (JSON) 格式,可以包含以下一种或两种有效负载:

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

有关有效负载的更多信息和示例,请参阅关于 FCM 消息

默认情况下,通知会从手机应用桥接到手表。如果您有一个独立的 Wear OS 应用和相应的手机应用,可能会出现重复通知。例如,手机和手表都收到来自 FCM 的单个通知,这两个设备可能会独立显示。您可以使用桥接 API 来防止这种情况。

使用后台服务

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

当屏幕关闭或进入环境模式足够长的时间后,可能会出现部分低电耗模式,后台任务可能会在特定时间段内被推迟。之后,当设备长时间静止时,会发生常规低电耗模式。使用 WorkManager API 安排请求,该 API 允许您的应用注册安全的低电耗模式代码执行。

使用约束条件进行调度

您可以使用约束条件来配置请求,从而延长电池续航。选择以下一项或多项约束条件以包含在您的请求中:

  • 调度需要网络的请求。

    指定 NetworkTypeCONNECTED 还是 UNMETEREDUNMETERED 用于大数据传输,而 CONNECTED 用于小数据传输。

  • 在充电时调度请求。

  • 在设备空闲时调度请求。这对于优先级较低的后台工作或同步非常有用,尤其是在设备充电时。

有关更多信息,请查阅 WorkManager 的约束条件对周期性工作的影响指南。