Datenelemente mit der Data Layer API synchronisieren

Ein DataItem definiert die Schnittstelle, die das System zum Synchronisieren von Daten zwischen Smartphones und Wearables verwendet. Ein DataItem besteht in der Regel aus den folgenden Komponenten:

  • Nutzlast:Ein Byte-Array, das Sie mit Daten festlegen können. So können Sie Ihre eigene Objektserialisierung und Deserialisierung durchführen. 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: Mit der Data Layer API können nur Nachrichten gesendet und Daten mit Android-Smartphones oder Wear OS Smartwatches synchronisiert werden. Wenn Ihr Wear OS-Gerät mit einem iOS-Gerät gekoppelt ist, funktioniert die Data Layer API nicht.

Verwenden Sie die Data Layer API daher nicht als primäre Methode zur Kommunikation mit einem Netzwerk. Folgen Sie stattdessen dem gleichen Muster wie bei einer mobilen App, mit einigen geringfügigen Unterschieden.

Normalerweise implementieren Sie DataItem nicht direkt. Stattdessen gehen Sie so vor:

  1. Erstellen Sie ein PutDataRequest-Objekt und geben Sie einen Stringpfad an, um das Element eindeutig zu identifizieren.
  2. Rufen Sie setData() auf, um die Nutzlast festzulegen.
  3. Wenn sich eine Verzögerung bei der Synchronisierung negativ auf die Nutzererfahrung auswirken würde, rufen Sie setUrgent() auf.
  4. Verwenden Sie die Methode putDataItem der Klasse DataClient, um das System aufzufordern, das Datenelement zu erstellen.

Wenn Sie Datenelemente anfordern, gibt das System Objekte zurück, die die DataItem-Schnittstelle ordnungsgemäß implementieren. Anstatt jedoch mit Rohbytes mit setData() zu arbeiten, empfehlen wir, dass Sie eine Datenzuordnung verwenden, die ein Datenelement mit einer Bundle-ähnlichen Schnittstelle verfügbar macht.

Weitere Informationen finden Sie in der Beispiel-App DataLayer.

Daten mit einer Datenzuordnung synchronisieren

Verwenden Sie nach Möglichkeit die DataMap Klasse. Mit diesem Ansatz können Sie mit Datenelementen in Form eines Android-Bundle arbeiten. Das System übernimmt also die Objektserialisierung und -deserialisierung für Sie und Sie können Daten mit Schlüssel/Wert-Paaren bearbeiten.

So verwenden Sie eine Datenzuordnung:

  1. Erstellen Sie ein PutDataMapRequest-Objekt und legen Sie den Pfad des Datenelements fest.

    Hinweis: Der Pfadstring ist eine eindeutige Kennung für das Datenelement, mit der Sie von beiden Seiten der Verbindung darauf zugreifen können. Der Pfad muss mit einem Schrägstrich beginnen. Wenn Sie hierarchische Daten in Ihrer App verwenden, erstellen Sie ein Pfadschema, das der Struktur der Daten entspricht.

  2. Rufen Sie PutDataMapRequest.getDataMap() auf, um eine Datenzuordnung abzurufen, für die Sie Werte festlegen können.
  3. Legen Sie Werte für die Datenzuordnung mit den put...() Methoden fest, z. B. putString().
  4. Wenn sich eine Verzögerung bei der Synchronisierung negativ auf die Nutzererfahrung auswirken würde, rufen Sie setUrgent() auf.
  5. Rufen Sie PutDataMapRequest.asPutDataRequest() auf, um ein PutDataRequest-Objekt abzurufen.
  6. Verwenden Sie die Methode putDataItem der Klasse DataClient, um das System aufzufordern, das Datenelement zu erstellen.

    Hinweis: Wenn die Verbindung zwischen Smartphone und Wearable-Gerät getrennt ist, werden die Daten gepuffert und synchronisiert, sobald die Verbindung wiederhergestellt ist.

Die Methode increaseCounter() im folgenden Beispiel zeigt, wie Sie eine Datenzuordnung erstellen und Daten darin ablegen:

private fun increaseCounter(): Task<DataItem> {
    val putDataReq: PutDataRequest = PutDataMapRequest.create("/count").run {
        dataMap.putInt(COUNT_KEY, count++)
        asPutDataRequest()
    }
    return Wearable.getDataClient(this)
        .putDataItem(putDataReq)
}

Weitere Informationen zum Umgang mit Tasks finden Sie in der Referenzdokumentation.

Achtung:Prüfen Sie vor der Verwendung der Wearable Data Layer API, ob sie auf einem Gerät verfügbar ist. Andernfalls tritt eine Ausnahme auf. Verwenden Sie die GoogleApiAvailability Klasse, wie in Horologist implementiert.

DataItem-Priorität festlegen

Die DataClient-API ermöglicht dringende Anfragen zur Synchronisierung von DataItem -Objekten. Normalerweise verzögert das System die Übermittlung von Datenelementen an das Wear OS-Netzwerk, um die Akkulaufzeit von Nutzergeräten zu verlängern. Wenn sich eine Verzögerung bei der Synchronisierung von Datenelementen jedoch negativ auf die Nutzererfahrung auswirkt, können Sie sie als dringend markieren. In einer Fernbedienungs-App, in der der Nutzer erwartet, dass seine Aktionen sofort angezeigt werden, können Sie beispielsweise das System auffordern, Ihre Datenelemente sofort zu synchronisieren, indem Sie setUrgent() aufrufen.

Wenn Sie setUrgent() nicht aufrufen, kann das System bis zu 30 Minuten warten, bevor es nicht dringende Datenelemente synchronisiert. In der Regel beträgt die Verzögerung jedoch nur wenige Minuten. Die Standardpriorität ist „nicht dringend“. Sie müssen also setUrgent() verwenden, wenn Sie das Verhalten der sofortigen Synchronisierung aus früheren Versionen der Wear OS API beibehalten möchten.

Auf Datenelementereignisse warten

Wenn eine Seite der Data Layer-Verbindung ein Datenelement ändert, benachrichtigen Sie den Nutzer über alle Änderungen auf der anderen Seite der Verbindung. Dazu können Sie einen Listener für Datenelementereignisse implementieren.

Das Code-Snippet im folgenden Beispiel benachrichtigt die App, wenn sich der Wert des im vorherigen Beispiel definierten Zählers ändert:

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

Diese Aktivität implementiert die DataClient.OnDataChangedListener Schnittstelle. Die Aktivität fügt sich selbst als Listener für Datenelementereignisse in der Methode onResume() hinzu und entfernt den Listener in der Methode onPause(). Eine Implementierung mit Bildern, Ansichtsmodellen und Diensten finden Sie in der Beispiel-App DataLayer.

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