使用数据 API 更改来更新表盘 UI

Using Data API changes to update watch face UI

我正在 API 的一项服务中使用数据 Android Wear 在表盘中,该表盘从 phone 应用中的云中提取数据并通过DataMap 到配对的手表应用程序。但我对如何在可穿戴端获得服务以正确收听更新并重绘其 UI 有点迷茫。我应该从同一个服务做这一切吗?

我尝试在扩展 CanvasWatchFaceService.Engine 的私有内部 class 中实现 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 意图过滤器有关,因为我在私有内部 class.

上实现它

感谢您的帮助!

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

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

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

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

我使用了一个单独的服务来监听数据项的变化。从那里开始,我使用 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"));
}
}

此代码基本上从 phone 获取数据并保存在本地。

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

这是我如何从手表方面做到这一点的基本概述。这在功能方面非常有效。没有配对的设备,它不会有任何数据问题,因为它已经处于离线状态。

虽然拥有单独的服务绝对符合要求,但我正在研究可能只为 CanvasWatchFaceService 提供一项服务并为数据层注册 API,似乎 Google 中的 DigitalWatchFaceService sample/android-WatchFace 举个例子。

注意它提供了注册为 BroadcastReceiver 和数据的示例 API。

希望对您有所帮助。

https://github.com/googlesamples/android-WatchFace/blob/master/Wearable/src/main/java/com/example/android/wearable/watchface/DigitalWatchFaceService.java