Nutzer beginnen häufig Aufgaben auf ihrem Android-Smartphone, z. B. das Überprüfen eines Dokuments, das Sortieren von Nachrichten oder das Durchsuchen einer Auswahl von Artikeln, und möchten dann auf ein Googlebook mit seinem größeren Display, der physischen Tastatur und dem Mehrfenstermodus wechseln.
Mit der Funktion Weiter auf in Android 17 (API‑Level 37) und höher kann in der Taskleiste des Googlebook ein App-Symbol (Vorschlag) für die Aktivität angezeigt werden, die ein Nutzer auf seinem Smartphone in der Nähe ausgeführt hat. Mit nur einem Klick können Nutzer ihre Aktivität auf ihrem Googlebook fortsetzen.
Durch die Implementierung der geräteübergreifenden Übergabe kann Ihre App den Aktivitätskontext übertragen, sodass der Nutzer seinen Workflow entweder in Ihrer adaptiven Android-App oder im Desktopbrowser genau an der Stelle fortsetzen kann, an der er auf seinem Smartphone aufgehört hat.
Übergabe-Flow auswählen
Bevor Sie die geräteübergreifende Übergabe aktivieren, müssen Sie festlegen, wie die einzelnen Aktivitäten in Ihrer Smartphone-App geöffnet werden sollen, wenn ein Nutzer auf einem Googlebook den Vorschlag „Auf anderem Gerät fortsetzen“ auswählt:
| Übergabeablauf | Auf Googlebook ausrichten | Optimal für | Key API |
|---|---|---|---|
| App-to-App-Übergabe | Native Android-App, die in einem Desktop-Fenster ausgeführt wird | Für große Bildschirme und Desktop-Freiform-Fenster optimierte Apps bei Google Play | HandoffActivityData.Builder |
| App-to-App-Übergabe mit Web-Fallback | Native Android-App, falls installiert; andernfalls eine URL im Standard-Desktopbrowser | Apps, die für ein natives Desktopfenster optimiert sind, aber einen zuverlässigen Browser-Fallback erfordern, wenn die App nicht auf dem Googlebook installiert ist | setFallbackUri |
| Direkte Übergabe an das Web | URL im Standard-Desktop-Browser (oder von der systemeigenen App abgefangen, wenn sie für Android-App-Links konfiguriert ist) | Workflows, bei denen Ihre Webanwendung die primäre Desktop-Umgebung ist | HandoffActivityData.createWebHandoff |
Handoff für eine Aktivität aktivieren
„Weiter auf“ ist standardmäßig deaktiviert und wird für jede Aktivität konfiguriert. Gehen Sie bei jeder Sendeaktivität auf dem Smartphone so vor:
- Rufen Sie
setHandoffEnabledauf und übergeben Sietrue, sobald die Aktivität den für die Übergabe erforderlichen Status geladen hat. Wenn die Funktion aktiviert ist, kann das System Handoff-Daten anfordern, während die Aktivität im Vordergrund ausgeführt wird oder in den Hintergrund verschoben wird. - Überschreiben Sie
onHandoffActivityDataRequested, um einHandoffActivityData-Objekt zurückzugeben, das nicht null ist. Sie können jederzeitisHandoffEnabledabfragen, um zu prüfen, ob die Übergabe für die Aktivität aktiv ist.
import android.app.Activity
import android.app.HandoffActivityData
import android.app.HandoffActivityDataRequestInfo
import android.os.Bundle
import android.os.PersistableBundle
class DocumentEditorActivity : Activity() {
private var documentId: String = "doc_42"
private var scrollOffsetPx: Int = 0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Enable handoff once the activity is ready to transfer state.
setHandoffEnabled(true, null)
}
override fun onHandoffActivityDataRequested(
handoffRequestInfo: HandoffActivityDataRequestInfo
): HandoffActivityData {
val extras = PersistableBundle().apply {
putString(EXTRA_DOCUMENT_ID, documentId)
putInt(EXTRA_SCROLL_OFFSET, scrollOffsetPx)
}
return HandoffActivityData.Builder(getComponentName())
.setExtras(extras)
.build()
}
companion object {
const val EXTRA_DOCUMENT_ID = "extra_document_id"
const val EXTRA_SCROLL_OFFSET = "extra_scroll_offset"
}
}
Paketaktivitätsstatus für die Übergabe
Das System ruft onHandoffActivityDataRequested in zwei Fällen auf:
- Übergabe im Vordergrund:Die Aktivität wird auf dem Smartphone im Vordergrund ausgeführt und der Nutzer initiiert eine Übergabe über die Taskleiste des Googlebook.
- Erfassung des Hintergrundstatus:Die Aktivität wird auf dem Smartphone in den Hintergrund verschoben und das System speichert die Handoff-Nutzlast im Cache, falls der Nutzer den Vorschlag später auf dem Googlebook auswählt.
Prüfen, ob die Übergabeanfrage aktiv ist
Prüfen Sie HandoffActivityDataRequestInfo mit isActiveRequest, um zwischen einer aktiven, vom Nutzer initiierten Übergabe und einer Speicherung im Hintergrund zu unterscheiden:
- Wenn
isActiveRequestden Werttruezurückgibt, hat der Nutzer aktiv angefordert, die Aktivität auf einem anderen Gerät fortzusetzen, während sie sichtbar ist. - Wenn
isActiveRequestfalsezurückgibt, speichert das System den Status im Cache, wenn die Aktivität beendet wird.
Wenn Sie auf dem Smartphone einen visuellen Hinweis anzeigen, der bestätigt, dass die Aufgabe auf das Googlebook übertragen wird, planen Sie die Aktualisierung der Benutzeroberfläche asynchron, damit onHandoffActivityDataRequested ohne Verzögerung zurückgegeben wird.
Zusätzliche Statusinformationen und Web-Fallback anhängen
Eine HandoffActivityData-Nutzlast enthält die folgenden Informationen:
- Zielkomponente (für die Übergabe von App zu App erforderlich): Übergabe
this.getComponentName()(dieComponentNameder Aktivität) oder eine expliziteComponentName(this, TargetActivity::class.java)anHandoffActivityData.Builder, um festzulegen, welche Aktivität auf Googlebook gestartet wird. - Extras (optional): Übergeben Sie ein
PersistableBundleansetExtras(), das Kennungen und UI-Koordinaten enthält, z. B. IDs für geöffnete Dokumente, Schlüssel für aktive Tabs oder Scrollpositionen. Das Bundle muss kleiner als 50 KB sein. - Fallback-URI (optional): Übergeben Sie einen Web-
UriansetFallbackUri, damit das Googlebook die Aufgabe im Standardbrowser öffnen kann, wenn Ihre Android-App nicht installiert ist.
import android.app.Activity
import android.app.HandoffActivityData
import android.app.HandoffActivityDataRequestInfo
import android.app.HandoffActivityParams
import android.net.Uri
import android.os.Bundle
import android.os.PersistableBundle
class ArticleReaderActivity : Activity() {
private var articleId: String = "android-desktop-windowing"
private var readingProgressPercent: Int = 45
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHandoffEnabled(
true,
HandoffActivityParams.Builder()
.setAllowHandoffWithoutPackageInstalled(true)
.build()
)
}
override fun onHandoffActivityDataRequested(
handoffRequestInfo: HandoffActivityDataRequestInfo
): HandoffActivityData {
if (handoffRequestInfo.isActiveRequest()) {
window.decorView.post {
onHandoffStartedToSecondaryDevice()
}
}
val extras = PersistableBundle().apply {
putString(EXTRA_ARTICLE_ID, articleId)
putInt(EXTRA_READING_PROGRESS, readingProgressPercent)
}
val fallbackWebUri = Uri.Builder()
.scheme("https")
.authority("example.com")
.appendPath("articles")
.appendPath(articleId)
.appendQueryParameter("progress", readingProgressPercent.toString())
.build()
return HandoffActivityData.Builder(getComponentName())
.setExtras(extras)
.setFallbackUri(fallbackWebUri)
.build()
}
private fun onHandoffStartedToSecondaryDevice() {
// Save local drafts and update phone UI without blocking handoff.
}
companion object {
const val EXTRA_ARTICLE_ID = "extra_article_id"
const val EXTRA_READING_PROGRESS = "extra_reading_progress"
}
}
Direkte Übergabe an das Web konfigurieren
Wenn Ihre primäre Desktop-Umgebung auf Googlebook eine Webanwendung ist, übergeben Sie HandoffActivityParams mit setAllowHandoffWithoutPackageInstalled(true) an setHandoffEnabled und rufen Sie HandoffActivityData.createWebHandoff anstelle von HandoffActivityData.Builder auf:
import android.app.Activity
import android.app.HandoffActivityData
import android.app.HandoffActivityDataRequestInfo
import android.app.HandoffActivityParams
import android.net.Uri
import android.os.Bundle
class WebDashboardActivity : Activity() {
private var projectId: String = "proj_901"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHandoffEnabled(
true,
HandoffActivityParams.Builder()
.setAllowHandoffWithoutPackageInstalled(true)
.build()
)
}
override fun onHandoffActivityDataRequested(
handoffRequestInfo: HandoffActivityDataRequestInfo
): HandoffActivityData {
val webUri = Uri.Builder()
.scheme("https")
.authority("app.example.com")
.appendPath("projects")
.appendPath(projectId)
.build()
return HandoffActivityData.createWebHandoff(webUri)
}
}
Status auf Googlebook empfangen und wiederherstellen
Wenn der Nutzer in der Googlebook-Taskleiste die Empfehlung „Weiter auf“ auswählt, startet das System das Ziel-ComponentName in einem Desktopfenster und hängt die PersistableBundle-Extras an den Start-Intent Intent an.
Auf Googlebooks sollte das eingehende Handoff mit Blick auf Desktop-Freiform-Fenster und Layouts mit mehreren Bereichen verarbeitet werden:
- Handoff-Extras extrahieren:Rufen Sie in den Methoden
onCreateundonNewIntentder empfangenden Aktivität die Extras aus dem eingehendenIntentab. Durch die Verarbeitung vononNewIntentwird sichergestellt, dass das Fenster aktualisiert wird, wenn Ihre Aktivität den StartmodussingleTopverwendet oder zu einem vorhandenen Desktopfenster weitergeleitet wird. - Status an Layouts mit mehreren Bereichen anpassen:Ein Status, der auf einem Smartphone eine Vollbild-Detailansicht belegt hat, wird auf einem Googlebook häufig einem ausgewählten Element in einem Listen-Detailansicht- oder unterstützenden Bereichslayout zugeordnet. Füllen Sie sowohl die Auswahl der primären Liste als auch den Detailbereich aus, damit das Desktopfenster den vollständigen Kontext enthält.
- Wiederhergestellten Status beim Ändern der Fenstergröße beibehalten:Speichern Sie den übergebenen Status in einem
ViewModel(SavedStateHandle) oderrememberSaveablein Jetpack Compose, damit das Ändern der Fenstergröße auf Googlebooks nicht die wiederhergestellte Sitzung zurücksetzt.
import android.app.Activity
import android.content.Intent
import android.os.Bundle
class DocumentEditorReceiverActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Restore from the handoff intent only on initial launch so subsequent
// desktop window configuration changes use saved instance state.
if (savedInstanceState == null) {
handleHandoffIntent(intent)
}
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
setIntent(intent)
handleHandoffIntent(intent)
}
private fun handleHandoffIntent(incomingIntent: Intent?) {
val documentId = incomingIntent?.getStringExtra(EXTRA_DOCUMENT_ID)
?: return
val scrollOffsetPx = incomingIntent.getIntExtra(EXTRA_SCROLL_OFFSET, 0)
openDocumentInDesktopWorkspace(
documentId = documentId,
initialScrollOffsetPx = scrollOffsetPx
)
}
private fun openDocumentInDesktopWorkspace(
documentId: String,
initialScrollOffsetPx: Int
) {
// Load the document into the list-detail layout and restore scroll position.
}
companion object {
const val EXTRA_DOCUMENT_ID = "extra_document_id"
const val EXTRA_SCROLL_OFFSET = "extra_scroll_offset"
}
}
Datenübertragung zwischen Smartphone und Googlebook testen
So überprüfen Sie Ihre Implementierung vollständig:
- Beide Geräte vorbereiten
- Melden Sie sich sowohl auf Ihrem Android-Smartphone (mit Android 17 oder höher) als auch auf Ihrem Googlebook (oder einem Testgerät im Desktop-Freiform-Fenster-Modus) mit demselben Google-Konto an.
- Aktiviere Bluetooth und verbinde beide Geräte mit demselben WLAN.
- Öffnen Sie auf beiden Geräten die Einstellungen > Verbundene Geräte > Verbindungseinstellungen > Dienste für mehrere Geräte > Aktivität fortsetzen, folgen Sie der Anleitung und aktivieren Sie Aufgaben. Die vollständigen Voraussetzungen für die Umgebung finden Sie unter Einrichtung und Test.
- App installieren
- Für die App-zu-App-Übergabe müssen Sie Ihren Build sowohl auf dem Smartphone als auch auf dem Googlebook installieren.
- Für Web-Fallback oder Direct-to-Web-Handoff installieren Sie Ihren Build auf dem Smartphone und lassen Sie die App auf dem Chromebook deinstalliert, damit Sie überprüfen können, ob der Browser die erwartete URL öffnet.
- Übergabe auslösen
- Öffnen Sie die App auf dem Smartphone und rufen Sie die Aktivität auf, die die Übergabe ermöglicht (rufen Sie
setHandoffEnabled(true, null)für die App-zu-App-Übergabe auf oder übergeben SieHandoffActivityParamsmitsetAllowHandoffWithoutPackageInstalled(true), wenn Sie die App auf dem Googlebook deinstalliert haben). - Suche auf dem Googlebook rechts in der Taskleiste nach dem App-Symbol mit dem Badge „Auf anderen Geräten fortsetzen“ und wähle es aus.
- Öffnen Sie die App auf dem Smartphone und rufen Sie die Aktivität auf, die die Übergabe ermöglicht (rufen Sie
- Desktop-Wiederherstellung überprüfen
- Prüfe, ob deine App in einem Desktopfenster (oder Browser-Tab) mit genau dem Element und der Scrollposition vom Smartphone geöffnet wird.
- Ändern Sie die Größe des App-Fensters auf Googlebook und prüfen Sie, ob die wiederhergestellten Inhalte und die Auswahl bei Übergängen zwischen Fenstergrößenklassen beibehalten werden.
Zusätzliche Ressourcen
- Adaptive Apps für Googlebook entwickeln
- Funktion „Weiter auf“
- Geräteübergreifende Übergabe aktivieren und anpassen
- UI-Zustände speichern