Android Wear 表盘是打包到穿戴式设备应用中的 Service。当用户选择其中一个可用表盘时,穿戴式设备会显示表盘并调用它的 Service 回调函数。
当您通过表盘安装穿戴式设备应用时,表盘将显示在穿戴式设备上的表盘选取器中。如果您想从手机中选择表盘,就必须从 Google Play 商店安装手表的配套应用(如果可用)。
本课将向您介绍如何配置要包含表盘的 Android 项目和如何实现表盘 Service。
创建和配置项目
要在 Android Studio 中为您的表盘创建 Android 项目,请执行以下操作:
- 点击 File > New Project,然后在 Create New Project 向导中按照步骤进行操作,直到您到达 Target Android Devices 页面。
- 选择 Wear 选项,然后在 Minimum SDK 选项列表中,选择最新的可用选项 (API Nougat)。点击 Next。
- 选择 Add No Activity,然后在以下两个屏幕中点击 Next。
- 点击 Finish。
Android Studio 会创建一个包含 wear
模块的项目。如需了解详细信息,请参阅创建项目。
依赖项
穿戴式设备支持库向您提供了为创建表盘实现而需要扩展的类。要使用 Wearable Data Layer API 在配套设备和穿戴式设备之间同步数据项,需要 Google Play 服务客户端库(play-services
和 play-services-wearable
)。
按照上述说明创建项目时,Android Studio 会在您的 build.gradle
文件中自动添加所需的条目。
穿戴式设备支持库 API 参考
参考文档提供了与您用于实现表盘的类有关的详细信息。浏览穿戴式设备支持库的 API 参考文档。
注:我们建议使用 Android Studio 进行 Android Wear 开发,因为使用它可以方便地进行项目设置、库集成和打包。
声明权限
表盘需要 WAKE_LOCK
权限。将以下权限添加到穿戴式设备应用和移动应用 manifest 文件的 manifest
元素下:
<manifest ...> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- Required for complications to receive complication data and open the provider chooser. --> <uses-permission android:name="com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA"/> ... </manifest>
注意:手持式设备应用必须包括在穿戴式设备应用中声明的所有权限。
实现 Service 和回调函数
Android Wear 中的表盘以 Service 形式实现。如果表盘处于活动状态,系统会在时间变化或重要事件(例如,切换到微光模式或接收新通知)发生时在其 Service 中调用函数。Service 实现随后会使用更新的时间和任何其他相关数据在屏幕上绘制表盘。
要实现表盘,您需要拓展 CanvasWatchFaceService
和 CanvasWatchFaceService.Engine
类,然后在 CanvasWatchFaceService.Engine
类中重写回调函数。这些类包含在穿戴式设备支持库中。
以下代码段概括介绍了您需要实现的主要函数:
public class AnalogWatchFaceService extends CanvasWatchFaceService { @Override public Engine onCreateEngine() { /* provide your watch face implementation */ return new Engine(); } /* implement service callback methods */ private class Engine extends CanvasWatchFaceService.Engine { @Override public void onCreate(SurfaceHolder holder) { super.onCreate(holder); /* initialize your watch face */ } @Override public void onPropertiesChanged(Bundle properties) { super.onPropertiesChanged(properties); /* get device features (burn-in, low-bit ambient) */ } @Override public void onTimeTick() { super.onTimeTick(); /* the time changed */ } @Override public void onAmbientModeChanged(boolean inAmbientMode) { super.onAmbientModeChanged(inAmbientMode); /* the wearable switched between modes */ } @Override public void onDraw(Canvas canvas, Rect bounds) { /* draw your watch face */ } @Override public void onVisibilityChanged(boolean visible) { super.onVisibilityChanged(visible); /* the watch face became visible or invisible */ } } }
CanvasWatchFaceService
类提供了一种类似于 View.invalidate()
函数的废弃机制。如果您想要系统重新绘制表盘,可以在您的实现内调用 invalidate()
函数。您只能在主界面线程中使用 invalidate()
函数。要将画布从另一个线程废弃,请调用 postInvalidate()
函数。
如需了解与在 CanvasWatchFaceService.Engine
类中实现函数有关的详细信息,请参阅绘制表盘。
注册表盘 Service
在实现表盘 Service 后,您可以在穿戴式设备应用的 manifest 文件中注册实现。在用户安装此应用时,系统将使用 Service 的相关信息让表盘在 Android Wear 配套应用和穿戴式设备上的表盘选取器中可用。
以下代码段显示了如何在application
元素下注册表盘实现:
<service android:name=".AnalogWatchFaceService" android:label="@string/analog_name" android:permission="android.permission.BIND_WALLPAPER" > <meta-data android:name="android.service.wallpaper" android:resource="@xml/watch_face" /> <meta-data android:name="com.google.android.wearable.watchface.preview" android:resource="@drawable/preview_analog" /> <meta-data android:name="com.google.android.wearable.watchface.preview_circular" android:resource="@drawable/preview_analog_circular" /> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> <category android:name= "com.google.android.wearable.watchface.category.WATCH_FACE" /> </intent-filter> </service>
在向用户显示设备上安装的所有表盘时,Android Wear 配套应用和穿戴式设备上的表盘选取器将使用 com.google.android.wearable.watchface.preview
元数据条目定义的预览图像。要获取这个可绘制对象,请在您的 Android Wear 设备上或者在模拟器实例中运行表盘,并进行屏幕截图。在具有 hdpi 屏幕上的 Android Wear 设备上,预览图像的大小一般为 320x320 像素。
在圆形设备上外观显著不同的表盘可以同时提供圆形和方形预览图像。要指定圆形预览图像,请使用 com.google.android.wearable.watchface.preview_circular
元数据条目。如果表盘同时包含两种预览图像,配套应用和穿戴式设备上的表盘选取器将根据表盘的形状显示合适的图像。如果不包含圆形预览图像,将为方形和圆形设备都使用方形预览图像。对于圆形设备,将使用圆形裁剪方形预览图像。
android.service.wallpaper
元数据条目指定 watch_face.xml
资源文件,后者包含一个 wallpaper
元素:
<?xml version="1.0" encoding="UTF-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" />
您的穿戴式设备应用可以包含多个表盘。您必须在穿戴式设备应用的 manifest 文件中为每一个表盘实现添加一个 Service 条目。