借助 Google Wear OS,手表可以直接与网络通信,无需连接 Android 或 iOS 手机。请勿使用数据层 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 网络。使用以下意图将用户直接发送到添加 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 网络。
图 1. 下载音乐的音乐应用流程。
电源和数据使用注意事项
为了节省电池电量并最大限度地减少移动数据使用量,请推迟任何非必要的网络任务(例如分析报告或日志收集),直到 Wear OS 设备重新建立蓝牙或 Wi-Fi 连接,而不是 LTE 或计量连接。
云消息传递
要发送通知,请直接使用Firebase Cloud Messaging (FCM)。
没有针对 Wear OS 的特定网络访问或 FCM API。请参阅有关连接到网络和云消息传递的现有文档。
FCM 与Doze 配合良好,并且是向手表发送通知的推荐方法。
当您的 Wear OS 应用运行时,通过收集设备的注册令牌来提供 FCM 的消息。然后,在您的服务器将消息发送到 FCM REST 端点时,将令牌作为目标的一部分包含在内。FCM 会将消息发送到由令牌标识的设备。
FCM 消息采用 JavaScript 对象表示法 (JSON) 格式,可以包含以下一种或两种有效负载。
- 通知有效负载:当手表收到通知有效负载时,数据会直接显示在用户的通知流中。当用户点击通知时,您的应用将启动。
- 数据有效负载:当有效负载具有一组自定义键值对时。有效负载将作为数据传递到您的 Wear OS 应用。
有关有效负载的更多信息和示例,请参阅关于 FCM 消息。
默认情况下,通知会从手机应用桥接到手表。如果您有独立的 Wear OS 应用和相应的手机应用,则可能会出现重复通知。例如,从 FCM 收到的单个通知(手机和手表都收到)可能会由两台设备独立显示。您可以使用桥接 API来防止这种情况。
使用后台服务
为了确保正确执行后台任务,它们必须考虑Doze和应用待机状态。
当屏幕关闭或进入环境模式足够长时间时,可能会发生 Doze 的子集,并且后台任务可能会被推迟一段时间。之后,当设备长时间静止不动时,就会发生常规 Doze。使用WorkManager
API 安排请求,该 API 允许您的应用注册 Doze 安全的代码执行。
使用约束进行调度
您可以使用约束以节省电池电量的方式配置请求。选择以下一个或多个约束以包含在您的请求中。
安排需要网络的请求。
指定
NetworkType
是CONNECTED
还是UNMETERED
。UNMETERED
用于大型数据传输,而CONNECTED
用于小型传输。在充电时安排请求。
在设备空闲时安排请求。这对于低优先级后台工作或同步非常有用,尤其是在设备充电时。
有关更多信息,请查看 WorkManager 的约束对定期工作的影响指南。