Datenelemente mit der Data Layer API synchronisieren

DataItem definiert die Schnittstelle, über die das System Daten zwischen Handhelds und Wearables. Ein DataItem besteht im Allgemeinen aus den folgenden Komponenten:

  • Nutzlast:Ein Byte-Array, das Sie mit Daten festlegen können. können Sie Ihre eigene Objektserialisierung durchführen und Deserialisierung. Die Größe der Nutzlast ist auf 100 KB begrenzt.
  • Pfad: Ein eindeutiger String, der mit einem Schrägstrich beginnen muss, z. B.: "/path/to/data"

Hinweis: Die Data Layer API kann nur mit Android-Smartphones oder Wear OS Nachrichten senden und Daten synchronisieren Uhren. Wenn Ihr Wear OS-Gerät mit einem iOS-Gerät gekoppelt ist, wird die Data Layer API nicht

Verwenden Sie die Data Layer API daher nicht als mit einem Netzwerk kommunizieren können. Folgen Sie stattdessen der <ph type="x-smartling-placeholder"></ph> gleiches Muster wie bei einer mobilen App, mit einigen geringfügigen Unterschieden.

Sie implementieren DataItem normalerweise nicht . Gehen Sie stattdessen so vor:

  1. erstellen PutDataRequest-Objekt mit einem Stringpfad zur eindeutigen Identifizierung das Element.
  2. anrufen setData(), um die Nutzlast festzulegen.
  3. Wenn sich eine Verzögerung bei der Synchronisierung negativ auf die Nutzererfahrung auswirken würde, rufen Sie <ph type="x-smartling-placeholder"></ph> setUrgent()
  4. Verwenden Sie die Methode putDataItem der <ph type="x-smartling-placeholder"></ph> DataClient, um anzufordern, dass das System das Datenelement erstellt.

Beim Anfordern von Datenelementen gibt das System Objekte zurück, die den Parameter DataItem-Schnittstelle. Anstatt mit Rohbyte zu arbeiten, setData(), wir empfehlen Ihnen, Datenzuordnung verwenden, ein Datenelement mit einer Bundle-ähnlichen Oberfläche verfügbar.

Weitere Informationen finden Sie in der DataLayer-Beispielanwendung verfügbar.

Daten mit einer Datenzuordnung synchronisieren

Verwenden Sie nach Möglichkeit die Methode DataMap. Auf diese Weise können Sie mit Datenelementen in Form einer Android-Bundle arbeiten. Das System führt also die Objektserialisierung und -deserialisierung für Sie durch und Sie können mit Schlüssel/Wert-Paaren.

So verwenden Sie eine Datenzuordnung:

  1. erstellen PutDataMapRequest-Objekt, wobei der Pfad des Datenelements festgelegt wird.

    Hinweis:Der Pfadstring ist eine eindeutige Kennzeichnung für den Datenelement, mit dem Sie von beiden Seiten der Verbindung darauf zugreifen können. Der Pfad muss mit einem Schrägstrich beginnen. Wenn Sie hierarchische Daten in Ihrem App erstellt haben, erstellen Sie ein Pfadschema, das mit der Struktur der Daten übereinstimmt.

  2. anrufen PutDataMapRequest.getDataMap(), um eine Datenzuordnung zu erhalten, die Sie Werte festlegen.
  3. Legen Sie Werte für die Datenzuordnung mit den put...()-Methoden fest, z. B. <ph type="x-smartling-placeholder"></ph> putString()
  4. Wenn sich eine Verzögerung bei der Synchronisierung negativ auf die Nutzererfahrung auswirken würde, rufen Sie <ph type="x-smartling-placeholder"></ph> setUrgent()
  5. anrufen PutDataMapRequest.asPutDataRequest(), um eine <ph type="x-smartling-placeholder"></ph> PutDataRequest-Objekt.
  6. Verwenden Sie die Methode putDataItem der <ph type="x-smartling-placeholder"></ph> DataClient, um anzufordern, dass das System das Datenelement erstellt.

    Hinweis: Wenn die Verbindung zwischen Smartphone und Wearable getrennt ist: werden die Daten gepuffert und synchronisiert, wenn die Verbindung wiederhergestellt ist.

Die Methode increaseCounter() im folgenden Beispiel zeigt, wie Sie ein Data Map ein und fügen Sie Daten ein:

Kotlin

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity() {

    private lateinit var dataClient: DataClient
    private var count = 0
    ...
    // Create a data map and put data in it
    private fun increaseCounter() {
        val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run {
            dataMap.putInt(COUNT_KEY, count++)
            asPutDataRequest()
        }
        val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)
    }
    ...
}

Java

public class MainActivity extends Activity {
    private static final String COUNT_KEY = "com.example.key.count";
    private DataClient dataClient;
    private int count = 0;
    ...
    // Create a data map and put data in it
    private void increaseCounter() {
        PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count");
        putDataMapReq.getDataMap().putInt(COUNT_KEY, count++);
        PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();
        Task<DataItem> putDataTask = dataClient.putDataItem(putDataReq);
    }
  ...
}

Weitere Informationen zur Handhabung <ph type="x-smartling-placeholder"></ph> Tasks, siehe <ph type="x-smartling-placeholder"></ph> Referenzdokumentation.

DataItem-Priorität festlegen

Die <ph type="x-smartling-placeholder"></ph> Die DataClient API ermöglicht dringende Anfragen zur Synchronisierung von DataItem Objekte. Normalerweise verzögert das System die Bereitstellung von Datenelementen Wear OS-Netzwerk verbinden, um die Akkulaufzeit der Nutzergeräte zu verbessern. Wenn sich eine Verzögerung bei der Synchronisierung von Datenelementen negativ auf die Nutzererfahrung auswirkt, können Sie als dringend kennzeichnen. Beispiel: In einer Fernbedienungs-App, bei der der Nutzer Aktionen sofort berücksichtigt werden, können Sie das System Ihre Datenelemente synchronisieren lassen. aufrufen, indem Sie <ph type="x-smartling-placeholder"></ph> setUrgent()

Wenn du setUrgent() nicht anrufst, kann das System bis zu 30 Minuten verzögern, nicht dringende Datenelemente synchronisieren, auch wenn die Verzögerung normalerweise nur wenige Minuten beträgt Minuten. Die standardmäßige Dringlichkeit ist nicht dringend, daher müssen Sie setUrgent(), wenn Sie das Verhalten der sofortigen Synchronisierung von früheren Versionen der Wear OS API.

Auf Datenelementereignisse warten

Benachrichtigen, wenn sich ein Datenelement auf einer Seite der Datenschichtverbindung ändert der Nutzenden über Änderungen auf der anderen Seite der Verbindung informiert. Implementieren Sie dazu einen Listener für Datenelementereignisse.

Mit dem Code-Snippet im folgenden Beispiel wird die App benachrichtigt, wenn der Wert des Zähler, der im vorherigen Beispiel definiert wurde:

Kotlin

private const val COUNT_KEY = "com.example.key.count"

class MainActivity : Activity(), DataClient.OnDataChangedListener {

    private var count = 0

    override fun onResume() {
        super.onResume()
        Wearable.getDataClient(this).addListener(this)
    }

    override fun onPause() {
        super.onPause()
        Wearable.getDataClient(this).removeListener(this)
    }

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

    // Method to update the count
    private fun updateCount(int: Int) { ... }
    ...
}

Java

public class MainActivity extends Activity implements DataClient.OnDataChangedListener {
    private static final String COUNT_KEY = "com.example.key.count";
    private int count = 0;

    @Override
    protected void onResume() {
        super.onResume();
        Wearable.getDataClient(this).addListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Wearable.getDataClient(this).removeListener(this);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        for (DataEvent event : dataEvents) {
            if (event.getType() == DataEvent.TYPE_CHANGED) {
                // DataItem changed
                DataItem item = event.getDataItem();
                if (item.getUri().getPath().compareTo("/count") == 0) {
                    DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                    updateCount(dataMap.getInt(COUNT_KEY));
                }
            } else if (event.getType() == DataEvent.TYPE_DELETED) {
                // DataItem deleted
            }
        }
    }

    // Method to update the count
    private void updateCount(int c) { ... }
    ...
}

In dieser Aktivität wird die DataClient.OnDataChangedListener-Schnittstelle. Die Aktivität wird von sich selbst hinzugefügt. als Listener für Datenelementereignisse der Methode onResume() und entfernt den Listener aus der onPause()-Methode. Um eine Implementierung mit Bildern, Modelle und finden Sie im DataLayer-Beispiel

Sie können den Listener auch als Dienst implementieren. Weitere Informationen finden Sie unter Auf Datenschicht warten Ereignisse.