2015-01-21 3 views
2

전화 앱에서 클라우드의 데이터를 가져 와서 DataMap을 통해 페어링 된 시계에 동기화하는 시계면에서 Android Wear 용 서비스에서 데이터 API를 사용하고 있습니다. 앱. 그러나 웨어러블 측에서 올바르게 업데이트를 청취하고 UI를 다시 그리는 서비스를받는 방법에 대해서는 약간 분실되어 있습니다. 나는이 모든 일을 같은 봉사에서해야 하는가?시계 API 업데이트를 사용하여 시계 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을 연장하는 별도의 서비스를 사용하여 I되어야하고, 만약 그렇다면, 어떻게 시계 얼굴 서비스의 onDraw에서 데이터를 추출합니까? 콜백 외부에서 DataEventBuffer를 직접 탭 할 수 있습니까?

개인 내부 클래스에서 구현 중이므로 매니페스트의 BIND_LISTENER 인 텐트 필터와 관련이 있다고 생각합니다.

도움 주셔서 감사합니다.

답변

1

이 두 서비스를 분리해야합니다. 시계 얼굴 서비스가 시계 모드를 그리면 데이터 API가 데이터 항목 변경을 처리합니다.

이제 어떻게 든 연결해야합니다. 몇 가지 방법이 있습니다. 실용적이고 아주 못생긴 것부터 시작하겠습니다. 데이터 API 서비스에는 공용, 정적 인터페이스가 있습니다.이 인터페이스를 통해 다른 구성 요소가 "청취자"를 등록하고 데이터 변경에 대한 정보를 얻을 수 있습니다. 같은 과정에있는 한 모든 것이 좋습니다. 시계 모드 엔진이 생성되면 리스너로 등록되고 파괴되면 자체 등록이 취소됩니다.

다른 대안이 있습니다. 데이터 API 서비스는 브로드 캐스트를 보낼 수 있으며 새로운 데이터 항목을 수신하면 시계 모드에서이를 수신 할 수 있습니다. 내부에 데이터를 포함하거나 데이터 항목으로 백업 된 콘텐츠 공급자를 가질 수 있습니다 (이 경우 콘텐츠 공급자는 데이터 API 서비스에서 브로드 캐스트를 수신하고 시계 모드는 해당 공급자에서 콘텐츠 관찰자를 갖습니다).

이러한 방법 중 어떤 것이 사용자의 요구 사항에 맞습니까?

+0

우수. 내가 필요한 것. 나는 그것을 돌려 줄 것이다. 도와 주셔서 감사합니다 (다시!) – user2302078

0

별도의 서비스를 사용하여 데이터 항목 변경을 수신 대기했습니다. 거기에서 SharedPreferences를 사용하여 데이터를 저장하고이를 Draw 메서드에서 호출합니다.

이 코드는 기본적으로 전화에서 데이터를 가져 와서 로컬에 저장합니다.

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

시계 측면에서 어떻게했는지에 대한 기본적인 개요입니다. 이것은 꽤 잘 기능을 현명하게 작동합니다. 페어링 된 기기가 없으면 이미 오프라인이므로 데이터 문제가 없습니다.

+0

굉장! @nick에게 감사합니다. :) – user2302078

1

별도의 서비스를 제공하는 것이 청구서에 잘 어울릴 수 있지만 CanvasWatchFaceService와 Data Layers 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