虽然拥有单独的服务绝对符合要求,但我正在研究可能只为CanvasWatchFaceService提供一项服务并注册数据层API,并且似乎Google sample / android-WatchFace中的DigitalWatchFaceService提供了一个示例。
请注意,它提供了将BroadcastReceiver和Data API都注册为示例的示例。
希望这可以帮助。
https://github.com/googlesamples/android-WatchFace/blob/master/Wearable/src/main/java/com/example/android/wearable/watchface/DigitalWatchFaceService.java
您应该将这两项服务分开。 Watch face services绘制表面,数据api服务处理数据项更改。
现在,你需要以某种方式连接它们。有几种方法。我将从实用的,非常丑陋的开始:您的数据api服务具有公共的静态接口,其他组件可以通过该接口注册“监听器”并获取有关数据更改的信息。只要你在同一个过程中,一切都很好。当你的表盘引擎被创建时,它会将自己注册为一个监听器,当它被破坏时,它会自行注销。
还有其他选择。您的数据api服务可以在收到新数据项时发送广播,并且监视面可以监听它们。它可以包含内部数据,也可以有数据项支持的内容提供者(在这种情况下,内容提供者将从数据api服务接收广播,并且监视面将在该提供者上具有内容观察者)。
这些方法中是否有适合您的需求?
我使用单独的服务来监听dataitem更改。从那里,我使用SharedPreferences存储数据并在我的Draw方法中调用它。
public class DataLayerService extends WearableListenerService implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { @Override public void onDataChanged(DataEventBuffer dataEvents) { SettingsManager sm = new SettingsManager(getApplicationContext()); //This is an interface for SharedPreferences I built for convenience DataMap dm = DataMap.fromByteArray(d.getDataItem().getData()); sm.setString("WP_ICON", dm.getString("Icon")); } }
此代码基本上从手机获取数据并在本地保存。
private class Engine extends CanvasWatchFaceService.Engine { @Override public void onDraw(Canvas canvas, Rect bounds) { Drawable weather = getDrawable(getIcon(sm.getString("WP_ICON"))); //The getIcon method chooses a Drawable based on the string. //The values are from a set list } }
这是我从手表方面做到这一点的基本概述。这非常好用。如果没有配对设备,它就不会有任何数据问题,因为它已经脱机。