Android NDK开发详解Wear之独立 Wear OS 应用与非独立 Wear OS 应用
我们建议 Wear OS 应用独立于手机运行,这样用户无需访问 Android 或 iOS 手机就可以在手表上完成任务。如果您的手表应用需要手机互动,您必须将 Wear OS 应用标记为非独立应用,并采取措施确保用户有可用的手机应用。
规划应用
您可以使用 Android App Bundle,为同一应用详情下每个用户的设备配置自动生成经过优化的 Android 软件包套件 (APK)。这样,用户只需下载其运行您的应用所需的代码和资源。
如需了解如何设置应用以通过 Google Play 商店进行分发,请参阅打包和分发 Wear OS 应用,以及 Android App Bundle 入门指南。
通常,Wear OS 应用的最低 API 级别是 API 级别 25 (Wear OS 2.0)。目标 API 级别必须是 API 级别 28 或更高级别。如需了解详情,请参阅满足 Google Play 的目标 API 级别要求。建议您将 targetSdkVersion 设置为 API 级别 30 (Wear OS 3),确保您的应用适用于最新平台版本。
如需了解网络请求和高带宽网络访问,请参阅 Wear OS 上的网络访问和同步。
将应用定义为 Wear OS 应用
您必须在应用的 Android 清单文件中定义 标记。如要表明这是手表应用,请添加如下所示的条目:
<manifest>
...
<uses-feature android:name="android.hardware.type.watch" />
...
</manifest>
将应用标识为独立应用或非独立应用
手表应用既能被视为独立应用,又能被视为非独立应用:
独立应用:完全独立的应用,不需要手机应用提供核心功能(包括身份验证)。手机应用将仅提供可选功能。
非独立应用:需要在手机或其他设备上运行应用以获取核心功能(包括身份验证)的依赖性应用。
在 Wear OS 应用中,在 Android 清单文件中设置 meta-data 元素 com.google.android.wearable.standalone 的值,以声明您的应用是独立应用还是非独立应用。
如果您的手表应用是一个完全独立的应用,您可以通过将 com.google.android.wearable.standalone 的值设置为 true,向 Google Play 商店表明这一点:
<application>
...
<meta-data
android:name="com.google.android.wearable.standalone"
android:value="true" />
...
</application>
如果您的手表应用是非独立应用且依赖于其他应用来实现核心功能,请将 com.google.android.wearable.standalone 的值设置为 false。这表示手表应用需要使用其他设备,但这不会影响您的应用在 Google Play 商店中的宣传活动。
注意:即使 com.google.android.wearable.standalone 的值为 false,用户也可以在安装手机应用前安装手表应用。因此,如果您的手表应用检测到配套应用缺少必要的手机应用(如本页所述),提示用户安装该手机应用。
共享代码和数据存储
您可以在 Wear OS 应用和手机应用之间共享代码。例如,网络的通用代码可以位于共享库中。
您也可以将专用于某个设备类型的代码放在单独的模块中。
您可以使用标准 Android 存储 API 在本地存储数据,就像在手机上存储一样。例如,您可以使用 SharedPreferences API 或 Room 持久性库。
在另一台设备上检测您的应用
您的手表应用和相应的手机应用可以各自检测另一应用是否可用。
手机应用或手表应用可使用 CapabilityClient 向配对的设备宣告自身的存在。它们可以静态或动态的方式实现这一点。
当某个应用在用户的 Wear OS 网络节点上(例如在手机、配对的手表或云端上)时,CapabilityClient 会允许其他应用对其进行检测。如需了解详情,请参阅宣告功能。
如果您的某个应用无法检测到另一个应用,您可以提示用户打开受影响设备上的 Play 商品详情。该解决方案适用于需要配对手机应用存在才能正常运行的手表应用。
您必须检查设备上的 Play Store 是否可用,因为某些手机(例如 iPhone)并不支持 Play Store。
以下部分介绍了针对两种场景的最佳实践:
您的独立手表应用需要您的手机应用
您的手机应用需要您的独立手表应用
您还可以在 GitHub 上查看演示此功能的示例应用。如需详细了解下一部分中介绍的类,请参阅 Wear OS API 参考文档。该参考文档还包含有关 PhoneDeviceType 类的信息,该类包含一个 getPhoneDeviceType() 方法,可让您的 Wear OS 应用检查配对手机是 Android 设备还是 iOS 设备。
指定用于检测应用的功能名称
对于与每个设备类型(手表或手机)对应的应用,请在 res/values/wear.xml 文件中为功能名称指定一个唯一的字符串。
例如,在 mobile 模块中,wear.xml 文件可包含以下内容:
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@array/android_wear_capabilities">
<string-array name="android_wear_capabilities">
<item>verify_remote_example_phone_app</item>
</string-array>
</resources>
在 Wear OS 模块中,wear.xml 文件将包含一个不同的功能名称值,如下所示:
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@array/android_wear_capabilities">
<string-array name="android_wear_capabilities">
<item>verify_remote_example_wear_app</item>
</string-array>
</resources>
如需了解详情,请参阅通告功能。
从手表进行应用检测并打开网址
您的手表应用可检测用户的配对手机上是否装有您的手机应用。请按照以下步骤操作:
使用 CapabilityClient 检查您的手机应用是否已安装在配对的手机上。如需了解详情,请参阅 GitHub 上的示例应用。
如果您的手机应用未安装在手机上,请使用 PhoneDeviceType.getPhoneDeviceType() 方法检查手机类型。如需了解详情,请参阅下一部分。
如果返回 PhoneDeviceType.DEVICE_TYPE_ANDROID,则表示该手机是 Android 手机。在 Wear OS 设备上调用 RemoteActivityHelper.startRemoteActivity() 以打开手机上的 Play 商店。为您的手机应用使用市场 URI,该 URI 可能不同于您的 Wear 应用的 URI。例如,使用如下所示的市场 URI:market://details?id=com.example.android.wearable.wear.finddevices
如果返回 PhoneDeviceType.DEVICE_TYPE_IOS,则表示手机是 iOS 手机(没有 Play 商店)。通过在 Wear OS 设备上调用 RemoteActivityHelper.startRemoteActivity(),打开 iPhone 上的 App Store。您可以指定应用的 iTunes 网址,例如 https://itunes.apple.com/us/app/yourappname。
您无法通过 Wear OS 以程序化方式确定 iOS 设备上是否已安装您的手机应用。最佳实践是为用户提供一个机制,让其通过手动触发来打开 App Store。
注意:使用之前介绍的 RemoteActivityHelper API 指定通过手表在手机上打开任何网址,并且不需要手机应用。
检测配对手机类型的详细信息
以下代码段使用 getPhoneDeviceType() 方法检查与手表配对的手机类型:
Kotlin
var phoneDeviceType: Int = PhoneDeviceType.getPhoneDeviceType(context)
Java
int phoneDeviceType = PhoneDeviceType.getPhoneDeviceType(context);
getPhoneDeviceType() 方法可返回以下值:
返回值 说明
DEVICE_TYPE_ANDROID 配对手机是 Android 设备。
DEVICE_TYPE_IOS 配对手机是 iOS 设备。
DEVICE_TYPE_ERROR_UNKNOWN 确定配对手机类型时出错,稍后应再次检查。
从 Android 手机启动应用检测
Android 手机可以检测用户的 Wear OS 设备上是否装有您的手表应用。请按照以下步骤操作:
使用 NodeClient,查找连接到用户手机的所有手表。如需了解详情,请参阅 GitHub 上的示例应用。
使用 CapabilityClient,检查用户的哪个手表安装了您的应用。
如果并非用户的所有手表都安装了您的应用,则允许用户通过 RemoteActivityHelper.startRemoteActivity() 方法从手机上打开其余 Wear OS 设备上的 Play 商店。为 Wear OS 应用使用市场 URI(它可能不同于您的手机应用的 URI)。例如,使用如下所示的市场 URI:market://details?id=com.example.android.wearable.wear.finddevices
与 iPhone 配对的手表的位置数据
对于与 iPhone 配对的手表,请使用一体化位置信息提供程序 (FLP) 获取手表上的位置数据。如需了解详情,请参阅在 Wear OS 上检测位置。
如果配对手机可用,FLP 将使用配对手机获取位置数据。
仅获取必要的数据
通常情况下,从互联网获取数据时,您应仅获取必要的数据。否则,可能会引发不必要的延迟、内存占用和电量消耗。
通过低功耗蓝牙连接手表时,您的应用获得的带宽可能只有每秒 4 千字节,具体取决于手表。因此,建议您执行以下步骤:
审核您的网络请求和响应,确保仅针对手机应用获取额外数据。
在通过网络将大图片发送到手表之前先将其压缩。
对于需要高带宽网络的情况,请参阅高带宽网络访问。
更多代码示例
WearVerifyRemoteApp 示例进一步演示了如何使用本页介绍的 API。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-13。