Erstellen Sie Kacheln mit Inhalten, die sich im Laufe der Zeit ändern.
Mit Zeitachsen arbeiten
Eine Zeitachse besteht aus einer oder mehreren TimelineEntry-Instanzen, die jeweils
ein Layout enthalten, das in einem bestimmten Zeitintervall angezeigt wird. Alle Kacheln benötigen eine Zeitachse.
Kacheln mit einem Eintrag
Oft kann eine Kachel mit einem einzelnen TimelineEntry beschrieben werden. Das Layout ist festgelegt und nur die Informationen im Layout ändern sich. Eine Kachel, die beispielsweise Ihren Fitnessfortschritt des Tages anzeigt, hat immer dasselbe Layout. Sie können dieses Layout jedoch so anpassen, dass andere Werte angezeigt werden. In diesen Fällen wissen Sie nicht im Voraus, wann sich der Inhalt ändern kann.
Hier ein Beispiel für eine Kachel mit einem einzelnen TimelineEntry:
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile?> { val tile = Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) // We add a single timeline entry when our layout is fixed, and // we don't know in advance when its contents might change. .setTileTimeline(Timeline.fromLayoutElement(simpleLayout(this))) .build() return Futures.immediateFuture(tile) }
Zeitgebundene Zeitachseneinträge
Für einen TimelineEntry kann optional ein Gültigkeitszeitraum definiert werden. So kann das Layout einer Kachel zu einem bestimmten Zeitpunkt geändert werden, ohne dass die App eine neue Kachel senden muss.
Ein typisches Beispiel ist eine Terminkachel, deren Zeitachse eine Liste anstehender Termine enthält. Jeder anstehende Termin hat einen Gültigkeitszeitraum, der angibt, wann er angezeigt werden soll.
Die Tiles API ermöglicht überlappende Gültigkeitszeiträume. Die Kachel mit dem kürzesten verbleibenden Zeitraum wird angezeigt. Es wird immer nur ein Termin angezeigt.
Entwickler können einen Standard-Fallback-Eintrag angeben. Die Terminkachel könnte beispielsweise eine Kachel mit einem unbegrenzten Gültigkeitszeitraum haben, die verwendet wird, wenn kein anderer Zeitachseneintrag gültig ist. Das sehen Sie im folgenden Codebeispiel:
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile?> { val timeline = Timeline.Builder() // Add fallback "no meetings" entry // Use the version of TimelineEntry that's in androidx.wear.protolayout. timeline.addTimelineEntry( TimelineBuilders.TimelineEntry.Builder().setLayout(getNoMeetingsLayout()).build() ) // Retrieve a list of scheduled meetings val meetings = MeetingsRepo.getMeetings() // Add a timeline entry for each meeting meetings.forEach { meeting -> timeline.addTimelineEntry( TimelineBuilders.TimelineEntry.Builder() .setLayout(getMeetingLayout(meeting)) .setValidity( // The tile should disappear when the meeting begins // Use the version of TimeInterval that's in // androidx.wear.protolayout. TimelineBuilders.TimeInterval.Builder() .setEndMillis(meeting.dateTimeMillis) .build() ) .build() ) } val tile = Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline(timeline.build()) .build() return Futures.immediateFuture(tile) }
Kachel aktualisieren
Die auf einer Kachel angezeigten Informationen können nach einiger Zeit ablaufen. Eine Wetterkachel, auf der beispielsweise den ganzen Tag über dieselbe Temperatur angezeigt wird, ist nicht genau.
Um mit ablaufenden Daten umzugehen, legen Sie beim Erstellen einer Kachel ein Aktualisierungsintervall fest, das angibt, wie lange die Kachel gültig ist. Im Beispiel der Wetterkachel können Sie die Inhalte beispielsweise stündlich aktualisieren, wie im folgenden Codebeispiel gezeigt:
override fun onTileRequest( requestParams: RequestBuilders.TileRequest ): ListenableFuture<Tile?> = Futures.immediateFuture( Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes .setTileTimeline(Timeline.fromLayoutElement(getWeatherLayout())) .build() )
Wenn Sie ein Aktualisierungsintervall festlegen, ruft das System onTileRequest()
kurz nach Ablauf des Intervalls auf. Wenn Sie kein Aktualisierungsintervall festlegen, ruft das System onTileRequest() nicht auf.
Eine Kachel kann auch aufgrund eines externen Ereignisses ablaufen. Ein Nutzer kann beispielsweise eine Besprechung aus seinem Kalender entfernen. Wenn die Kachel nicht aktualisiert wurde, wird die gelöschte Besprechung weiterhin angezeigt. In diesem Fall können Sie eine Aktualisierung von einer beliebigen Stelle im Anwendungscode anfordern, wie im folgenden Codebeispiel gezeigt:
fun eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService::class.java) }
Aktualisierungs-Workflow auswählen
Beachten Sie diese Best Practices, um zu bestimmen, wie Sie Ihre Kachelaktualisierungen konfigurieren:
- Wenn die Aktualisierung vorhersehbar ist, z. B. für den nächsten Termin im Kalender des Nutzers, verwenden Sie eine Zeitachse.
- Wenn Sie Plattformdaten abrufen, verwenden Sie die Datenbindung, damit das System die Daten automatisch aktualisiert.
Wenn die Aktualisierung auf dem Gerät in kurzer Zeit berechnet werden kann, z. B. wenn die Position eines Bildes auf einer Kachel mit Sonnenaufgangszeiten aktualisiert wird, verwenden Sie
onTileRequest().Das ist besonders nützlich, wenn Sie alle Bilder im Voraus generieren müssen. Wenn Sie zu einem späteren Zeitpunkt ein neues Bild generieren müssen, rufen Sie
setFreshnessIntervalMillis()auf.Wenn Sie wiederholt intensivere Hintergrundaufgaben ausführen, z. B. das Abrufen von Wetterdaten, verwenden Sie
WorkManagerund senden Sie Aktualisierungen an Ihre Kachel.Wenn die Aktualisierung als Reaktion auf ein externes Ereignis erfolgt, z. B. wenn das Licht eingeschaltet wird, Sie eine E-Mail erhalten oder eine Notiz aktualisiert wird, senden Sie eine Firebase Cloud Messaging-Nachricht (FCM), um Ihre App wieder zu aktivieren, und senden Sie dann Aktualisierungen an die Kachel.
Wenn der Synchronisierungsprozess für Kacheldaten teuer sein kann, gehen Sie so vor:
- Planen Sie eine Datensynchronisierung.
- Starten Sie einen Timer für 1–2 Sekunden.
- Wenn Sie vor Ablauf der Zeit eine Aktualisierung von einer Remote-Datenquelle erhalten, zeigen Sie den aktualisierten Wert aus der Datensynchronisierung an. Andernfalls zeigen Sie einen im Cache gespeicherten lokalen Wert an.
Empfehlungen für Sie
- Hinweis: Linktext wird angezeigt, wenn JavaScript deaktiviert ist
- Auswirkungen regelmäßiger Updates minimieren
- Im Hintergrund auf den Standort zugreifen
- Erste Schritte mit WorkManager