使用Data API更改来更新watch face UI

时间:2015-01-21 01:48:00

标签: android wear-os

我在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意图过滤器有关,因为我在私有内部类上实现它。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您应该将这两项服务分开。 Watch face services绘制表面,数据api服务处理数据项更改。

现在,您需要以某种方式连接它们。有几种方法。我将从实用,非常丑陋的开始:您的数据api服务具有公共的静态接口,其他组件可以通过该接口注册"听众"并获取有关数据更改的信息。只要你在同一个过程中,一切都很好。当您的表盘引擎被创建时,它会将自己注册为聆听者,当它被摧毁时,它会自行注销。

还有其他选择。您的数据api服务可以在收到新数据项时发送广播,并且监视面可以监听它们。它可以包含内部数据,也可以有数据项支持的内容提供者(在这种情况下,内容提供者将从数据api服务接收广播,并且监视面将在该提供者上拥有内容观察者)。 / p>

这些方法中是否符合您的需求?

答案 1 :(得分:1)

虽然拥有单独的服务绝对符合要求,但我正在研究可能只为CanvasWatchFaceService提供一项服务并注册数据层API,并且似乎Google示例/ 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

答案 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
   }
}

这是我从手表方面做到这一点的基本概述。这非常好用。如果没有配对设备,它就不会有任何数据问题,因为它已经脱机。