Synchronizowanie elementów danych z interfejsem Data Layer API

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:

  1. Utwórz obiekt PutDataRequest, określając ścieżkę ciągu znaków, która jednoznacznie identyfikuje element.
  2. Wywołaj setData(), aby ustawić ładunek.
  3. Jeśli opóźnienie w synchronizacji miałoby negatywny wpływ na wrażenia użytkownika, wywołaj setUrgent().
  4. Użyj metody putDataItem klasy DataClient, 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:

  1. 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.

  2. Wywołaj PutDataMapRequest.getDataMap(), aby uzyskać mapę danych, na której możesz ustawić wartości.
  3. Ustaw wartości mapy danych za pomocą metod put...(), takich jak putString().
  4. Jeśli opóźnienie w synchronizacji miałoby negatywny wpływ na wrażenia użytkownika, wywołaj setUrgent().
  5. Wywołaj PutDataMapRequest.asPutDataRequest(), aby uzyskać obiekt PutDataRequest.
  6. Użyj metody putDataItem klasy DataClient, 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.