我在Android Wear服务中使用Data API,在手机应用程序中从云中提取数据,并通过DataMap将其同步到配对的手表应用程序。但我对如何在可穿戴设备上获取服务以正确收听更新并重新绘制其UI感到有点迷失。我应该从同一个服务中做到这一切吗?
我尝试在扩展CanvasWatchFaceService.Engine的私有内部类中实现DataApi.DataListener方法,但这似乎不起作用。
@Override
public Engine onCreateEngine() {
return new Engine();
}
private class Engine extends CanvasWatchFaceService.Engine implements DataApi.DataListener {
// other events and methods...
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for(DataEvent event : dataEvents) {
DataItem dataItem = event.getDataItem();
if(PATH.equals(dataItem.getUri().getPath())) {
DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
downloadedTrends = dataMap.getString(DATAMAP_KEY);
}
}
}
@Override
public void onDraw(Canvas canvas, Rect bounds) {
// use the changed data here to update the watch face UI
}
}
我是否应该使用扩展WearableListenerService的单独服务,如果是这样,我如何在监视面服务中提取onDraw中的数据?我可以直接在回调之外点击DataEventBuffer吗?
我还认为它可能与清单中的BIND_LISTENER意图过滤器有关,因为我在私有内部类上实现它。
感谢您的帮助!
答案 0 :(得分:1)
您应该将这两项服务分开。 Watch face services绘制表面,数据api服务处理数据项更改。
现在,您需要以某种方式连接它们。有几种方法。我将从实用,非常丑陋的开始:您的数据api服务具有公共的静态接口,其他组件可以通过该接口注册"听众"并获取有关数据更改的信息。只要你在同一个过程中,一切都很好。当您的表盘引擎被创建时,它会将自己注册为聆听者,当它被摧毁时,它会自行注销。
还有其他选择。您的数据api服务可以在收到新数据项时发送广播,并且监视面可以监听它们。它可以包含内部数据,也可以有数据项支持的内容提供者(在这种情况下,内容提供者将从数据api服务接收广播,并且监视面将在该提供者上拥有内容观察者)。 / p>
这些方法中是否符合您的需求?
答案 1 :(得分:1)
虽然拥有单独的服务绝对符合要求,但我正在研究可能只为CanvasWatchFaceService提供一项服务并注册数据层API,并且似乎Google示例/ android-WatchFace中的DigitalWatchFaceService提供了一个示例
请注意,它提供了将BroadcastReceiver和Data API注册的示例。
希望这有帮助。
答案 2 :(得分:0)
我使用单独的服务来监听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
}
}
这是我从手表方面做到这一点的基本概述。这非常好用。如果没有配对设备,它就不会有任何数据问题,因为它已经脱机。