A DataItem
określa interfejs, którego system używa do synchronizowania danych między urządzeniami przenośnymi a
urządzeniami do noszenia. DataItem składa się zwykle z tych komponentów:
- Ładunek: tablica bajtów, którą możesz ustawić za pomocą danych, co pozwala na samodzielne serializowanie i deserializowanie obiektów. Rozmiar ładunku jest ograniczony do 100 KB.
-
Ścieżka: unikalny ciąg znaków, który musi zaczynać się od ukośnika, np.
"/path/to/data".
Uwaga:
interfejs Data Layer API może wysyłać wiadomości i synchronizować dane tylko z telefonami z Androidem lub zegarkami z Wear OS
Jeśli urządzenie z Wear OS jest sparowane z urządzeniem z iOS, interfejs Data Layer API nie będzie
działać.
Z tego powodu nie używaj interfejsu Data Layer API jako
głównego sposobu komunikacji z siecią. Zamiast tego postępuj
tak samo jak w przypadku aplikacji mobilnej, z niewielkimi różnicami.
Zwykle nie implementujesz DataItem
bezpośrednio. Zamiast tego wykonaj te czynności:
-
Utwórz obiekt
PutDataRequest, określając ścieżkę ciągu znaków, która jednoznacznie identyfikuje element. -
Wywołaj
setData(), aby ustawić ładunek. -
Jeśli opóźnienie w synchronizacji miałoby negatywny wpływ na wrażenia użytkownika, wywołaj
setUrgent(). -
Użyj metody
putDataItemklasyDataClient, aby poprosić system o utworzenie elementu danych.
Podczas wysyłania żądania o elementy danych system zwraca obiekty, które prawidłowo implementują interfejs DataItem. Zamiast jednak pracować z surowymi bajtami za pomocą
setData(), zalecamy, abyś
używał mapy danych,
która udostępnia element danych z interfejsem podobnym do Bundle.
Więcej informacji znajdziesz w aplikacji przykładowej DataLayer.
Synchronizowanie danych z mapą danych
Jeśli to możliwe, używaj klasy
DataMap.
Dzięki temu możesz pracować z elementami danych w postaci Androida Bundle, więc system wykonuje serializację i deserializację obiektów, a Ty możesz manipulować danymi za pomocą par klucz-wartość.
Aby użyć mapy danych:
-
Utwórz obiekt
PutDataMapRequest, ustawiając ścieżkę elementu danych.Uwaga: ciąg ścieżki jest unikalnym identyfikatorem elementu danych, który umożliwia dostęp do niego z obu stron połączenia. Ścieżka musi zaczynać się od ukośnika. Jeśli w aplikacji używasz danych hierarchicznych, utwórz schemat ścieżki, który odpowiada strukturze danych.
-
Wywołaj
PutDataMapRequest.getDataMap(), aby uzyskać mapę danych, na której możesz ustawić wartości. -
Ustaw wartości mapy danych za pomocą metod
put...(), takich jakputString(). -
Jeśli opóźnienie w synchronizacji miałoby negatywny wpływ na wrażenia użytkownika, wywołaj
setUrgent(). -
Wywołaj
PutDataMapRequest.asPutDataRequest(), aby uzyskać obiektPutDataRequest. -
Użyj metody
putDataItemklasyDataClient, aby poprosić system o utworzenie elementu danych.Uwaga: jeśli telefon i urządzenie do noszenia są odłączone, dane są buforowane i synchronizowane po ponownym nawiązaniu połączenia.
Metoda increaseCounter() w tym przykładzie pokazuje, jak utworzyć mapę danych i umieścić w niej dane:
private fun increaseCounter(): Task<DataItem> { val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run { dataMap.putInt(COUNT_KEY, count++) asPutDataRequest() } return Wearable.getDataClient(this) .putDataItem(putDataReq) }
Więcej informacji o obsłudze
Tasks znajdziesz w
dokumentacji referencyjnej.
Uwaga: przed użyciem interfejsu Wearable Data Layer API sprawdź, czy jest on dostępny na urządzeniu. W przeciwnym razie wystąpi wyjątek. Użyj klasy GoogleApiAvailability
zaimplementowanej w Horologist.
Ustawianie priorytetu DataItem
Interfejs
DataClient API umożliwia wysyłanie pilnych żądań synchronizacji obiektów
DataItem.
Zwykle system opóźnia dostarczanie elementów danych do sieci Wear OS, aby wydłużyć czas pracy na baterii urządzeń użytkowników, ale jeśli opóźnienie w synchronizacji elementów danych ma negatywny wpływ na wrażenia użytkownika, możesz oznaczyć je jako pilne. Na przykład w aplikacji do zdalnego sterowania, w której użytkownik oczekuje natychmiastowego odzwierciedlenia swoich
działań, możesz poprosić system o natychmiastowe zsynchronizowanie elementów danych
natychmiast, wywołując
setUrgent().
Jeśli nie wywołasz setUrgent(), system może opóźnić synchronizację niepilnych elementów danych nawet o 30 minut, chociaż zwykle opóźnienie wynosi tylko kilka minut. Domyślny priorytet to „niepilne”, więc jeśli chcesz zachować natychmiastową synchronizację z poprzednich wersji interfejsu Wear OS API, musisz użyć setUrgent().
Nasłuchiwanie zdarzeń elementu danych
Jeśli jedna strona połączenia warstwy danych zmieni element danych, powiadom użytkownika o zmianach po drugiej stronie połączenia. Możesz to zrobić, implementując detektor zdarzeń elementu danych.
Fragment kodu w tym przykładzie powiadamia aplikację, gdy zmieni się wartość licznika zdefiniowanego w poprzednim przykładzie:
override fun onDataChanged(dataEvents: DataEventBuffer) { dataEvents.forEach { event -> // DataItem changed if (event.type == DataEvent.TYPE_CHANGED) { event.dataItem.also { item -> if (item.uri.path?.compareTo("/count") == 0) { DataMapItem.fromDataItem(item).dataMap.apply { updateCount(getInt(COUNT_KEY)) } } } } else if (event.type == DataEvent.TYPE_DELETED) { // DataItem deleted } } }
Ta aktywność implementuje interfejs
DataClient.OnDataChangedListener. Aktywność dodaje się jako detektor zdarzeń elementu danych w metodzie onResume() i usuwa detektor w metodzie onPause(). Aby zobaczyć implementację z użyciem obrazów, modeli widoków i
usług, zapoznaj się z aplikacją przykładową DataLayer.
Detektor możesz też zaimplementować jako usługę. Więcej informacji znajdziesz w artykule Nasłuchiwanie zdarzeń warstwy danych.