Erstellen Sie Kacheln mit Inhalten, die sich im Laufe der Zeit ändern.
Mit Zeitplänen arbeiten
Eine Zeitachse besteht aus einem oder mehreren
TimelineEntry
-Instanzen enthalten, von denen jede ein Layout enthält, das während einer bestimmten
Zeitintervall. Alle Kacheln benötigen eine Zeitachse.
Kacheln mit einem einzelnen Eintrag
Häufig kann eine Kachel mit einer einzelnen TimelineEntry
beschrieben werden. Das Layout ist
und nur die Informationen im Layout ändern sich. Zum Beispiel kann eine Kachel
der deine Fitnessfortschritte des Tages anzeigt, zeigt immer den gleichen Fortschritt an.
Layout ändern, auch wenn Sie dieses Layout
anpassen können, um andere Werte anzuzeigen. In diesen
wissen Sie im Voraus nicht, wann sich der Inhalt ändern wird.
Hier ein Beispiel für eine Kachel mit einem einzelnen TimelineEntry
:
Kotlin
override fun onTileRequest( requestParams: 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(...) ).build() return Futures.immediateFuture(tile) }
Java
@Override protected ListenableFuture<Tile> onTileRequest( @NonNull TileRequest requestParams ) { Tile tile = new 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(...) ).build(); return Futures.immediateFuture(tile); }
Zeitgebundene Zeitachseneinträge
Ein TimelineEntry
kann optional einen Gültigkeitszeitraum definieren, sodass eine Kachel
das Layout zu einem bekannten Zeitpunkt ändern, ohne dass die App eine neue Kachel bereitstellen muss.
Das kanonische Beispiel ist eine Agendakachel, deren Zeitachse eine Liste von anstehende Termine. Jedes bevorstehende Ereignis enthält einen Gültigkeitszeitraum, um sie anzuzeigen.
Die Tile API ermöglicht sich überschneidende Gültigkeitszeiträume, wobei der Bildschirm mit der kürzeste Zeitdauer wird angezeigt. Es wird jeweils nur ein Ereignis .
Entwickler können einen Standard-Fallback-Eintrag angeben. Zum Beispiel kann die Kachel „Agenda“ eine Kachel mit einem unendlichen Gültigkeitszeitraum haben, die verwendet wird, Zeitachseneintrag gültig ist, wie im folgenden Codebeispiel gezeigt:
Kotlin
public override fun onTileRequest( requestParams: 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(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(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. TimeInterval.Builder() .setEndMillis(meeting.dateTimeMillis).build() ).build() ) } val tile = Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline(timeline.build()) .build() return Futures.immediateFuture(tile) }
Java
@Override protected ListenableFuture<Tile> onTileRequest( @NonNull RequestBuilders.TileRequest requestParams ) { Timeline.Builder timeline = new Timeline.Builder(); // Add fallback "no meetings" entry // Use the version of TimelineEntry that's in androidx.wear.protolayout. timeline.addTimelineEntry(new TimelineEntry.Builder().setLayout(getNoMeetingsLayout()).build()); // Retrieve a list of scheduled meetings List<Meeting> meetings = MeetingsRepo.getMeetings(); // Add a timeline entry for each meeting for(Meeting meeting : meetings) { timeline.addTimelineEntry(new 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. new TimeInterval.builder() .setEndMillis(meeting.getDateTimeMillis()).build() ).build() ); } Tile tile = new Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setTileTimeline(timeline.build()) .build(); return Futures.immediateFuture(tile); }
Kachel aktualisieren
Die in einer Kachel angezeigten Informationen laufen möglicherweise nach einiger Zeit ab. Zum Beispiel wird die Wettervorhersage Kachel, die die gleiche Temperatur den ganzen Tag über anzeigt, ist ungenau.
Wenn Sie ablaufende Daten verarbeiten möchten, legen Sie beim Erstellen eines tile, der angibt, wie lange die Tile gültig ist. Im Beispiel des Wetters können Sie deren Inhalt stündlich aktualisieren, wie im folgenden Code dargestellt: Beispiel:
Kotlin
override fun onTileRequest(requestParams: RequestBuilders.TileRequest) = Futures.immediateFuture(Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes .setTileTimeline(Timeline.fromLayoutElement( getWeatherLayout()) ).build() )
Java
@Override protected ListenableFuture<Tile> onTileRequest( @NonNull TileRequest requestParams ) { return Futures.immediateFuture(new Tile.Builder() .setResourcesVersion(RESOURCES_VERSION) .setFreshnessIntervalMillis(60 * 60 * 1000) // 60 minutes .setTimeline(Timeline.fromLayoutElement( getWeatherLayout()) ).build()); }
Wenn Sie ein Aktualisierungsintervall festlegen, ruft das System
onTileRequest()
kurz nach Ende des Intervalls. Wenn Sie kein Aktualitätsintervall festlegen,
Das System ruft onTileRequest()
nicht auf.
Eine Tile kann auch aufgrund eines externen Ereignisses ablaufen. Zum Beispiel könnten Nutzende entfernten Termin aus ihrem Kalender. Wurde die Kachel nicht aktualisiert, zeigt die gelöschte Besprechung immer noch an. Fordern Sie in diesem Fall eine Aktualisierung von an einer beliebigen Stelle in Ihrem Anwendungscode, wie im folgenden Codebeispiel gezeigt:
Kotlin
fun eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService::class.java) }
Java
public void eventDeletedCallback() { TileService.getUpdater(context) .requestUpdate(MyTileService.class); }
Aktualisierungsworkflow auswählen
Orientieren Sie sich an diesen Best Practices, um festzulegen, wie Sie Ihre Kachel-Updates konfigurieren:
- Wenn das Update vorhersehbar ist, zum Beispiel, wenn es für das nächste Ereignis in des Nutzers – verwenden Sie eine Zeitachse.
- Verwenden Sie beim Abrufen von Plattformdaten die Datenbindung, damit das System aktualisiert wird die Daten automatisch abrufen.
Wenn das Update in kurzer Zeit auf dem Gerät berechnet werden kann, z. B. wie zum Aktualisieren der Position eines Bildes auf einer Sonnenaufgangskachel. Verwenden Sie
onTileRequest()
Dies ist besonders nützlich, wenn Sie alle Bilder vor der . Wenn Sie später ein neues Bild generieren müssen, rufen Sie
setFreshnessIntervalMillis()
Wenn Sie wiederholt intensivere Hintergrundarbeiten ausführen, z. B. Abfragen für Wetterdaten verwenden Sie
WorkManager
und senden Sie Updates an Ihre Kachel.Wenn das Update als Reaktion auf ein externes Ereignis wie das Licht Zum Aktivieren, Empfangen einer E-Mail oder zum Aktualisieren einer Notiz – senden Sie eine Firebase Cloud Messaging (FCM), um Ihre App wieder zu aktivieren, und senden Sie dann Updates. hinzugefügt werden.
Wenn das Synchronisieren der Kacheldaten kostspielig sein könnte, gehen Sie so vor:
- Datensynchronisierung planen
- Starte einen Timer für 1 bis 2 Sekunden.
- Wenn Sie vor Ablauf der Zeit ein Update von einer Remote-Datenquelle erhalten, um den aktualisierten Wert aus der Datensynchronisierung anzuzeigen. Andernfalls wird ein im Cache gespeichertes lokalen Wert.
Empfehlungen für dich
- Hinweis: Der Linktext wird angezeigt, wenn JavaScript deaktiviert ist.
- Auswirkungen regelmäßiger Updates minimieren
- Im Hintergrund auf den Standort zugreifen
- Erste Schritte mit WorkManager