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

谢谢你的帮助!

最佳答案

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

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

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

这些方法是否满足您的需求?

关于android - 使用Data API更改来更新表盘界面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28058284/

10-11 20:10