借助 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 设备重新建立 Bluetooth 或 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 的 约束对周期性工作的影响 指南。