Übergabe zwischen Geräten aktivieren und anpassen

„Weiter auf“ führt neue Methoden und Klassen ein, mit denen du die Unterstützung für die Funktion angeben und die erforderlichen Daten bereitstellen kannst, die weitergegeben werden. So kannst du die Nutzererfahrung auf dem Empfängergerät ordnungsgemäß fortsetzen.

Unterstützung aktivieren

Die Unterstützung für „Weiter auf“ (standardmäßig deaktiviert) muss für jede Aktivität einzeln implementiert werden. Wenn Sie die Funktion aktivieren möchten, rufen Sie setHandoffEnabled auf, um die aktuelle Aktivität als bereit für die Übergabe zu kennzeichnen. Nachdem setHandoffEnabled(true, null) aufgerufen wurde, kann die Übergabe jederzeit für die Aktivität erfolgen. Rufe die Methode also nur auf, wenn die Aktivität für die Übergabe bereit ist.

Mit isHandoffEnabled können Sie prüfen, ob die Aktivität „Fortsetzen“ aktiviert hat. Wenn für eine Aktivität die Übergabe aktiviert ist, muss sie auch onHandoffActivityDataRequested implementieren, um sicherzustellen, dass ein HandoffActivityData zurückgegeben wird, der nicht null ist, da kein Standardverhalten implementiert ist.

class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...
    // Enable handoff
    setHandoffEnabled(true, null)
  }

  // Override and implement onHandoffActivityDataRequested
  override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {
    // Create and return handoff data
  }
}

Du konfigurierst das HandoffActivityData-Objekt mit allen relevanten Extras und einem Fallback-URI, um „Weiter auf“ darüber zu informieren, wie die Übergabe an das Empfängergerät erfolgen soll.

Diese Daten werden in zwei Situationen vom System benötigt:

  • Die Aktivität wird in den Hintergrund verschoben und relevante Daten müssen gespeichert werden.
  • Die Aktivität befindet sich im Vordergrund und es wurde eine Übergabe angefordert. Sie können den Status einer Übergabeanfrage prüfen.

Status prüfen

Die Klasse HandoffActivityDataRequestInfo liefert Informationen zur aktuellen Anfrage zur Übergabe einer Aktivität. Mit isActiveRequest können Sie feststellen, ob die Anfrage derzeit aktiv ist. Wenn die Methode

  • „true“: Die aktuelle Aktivität befindet sich im Vordergrund und der Nutzer hat die Funktion „Weiter auf“ für ein anderes Gerät angefordert. Wenn jedoch
  • „false“: Die Aktivität wurde beendet und befindet sich im Hintergrund, aber der Nutzer kann in Zukunft eine Übergabe anfordern.

Wenn du auf dem sendenden Gerät eine UI anzeigen möchtest, um den Nutzer darüber zu informieren, dass eine Übergabe stattgefunden hat oder im Gange ist, kannst du isActiveRequest auf eine aktive Anfrage prüfen. Führen Sie diesen Code jedoch nicht synchron als Teil von onHandoffActivityDataRequested aus. Stattdessen sollten Sie den Code so in die Warteschlange stellen, dass er asynchron ausgeführt wird, damit die Übergabe nicht blockiert oder verzögert wird.

// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {

  // Check whether the handoff request is active
  if (handoffRequestInfo.isActiveRequest()) {
    // Asynchronously show UI to let users know a handoff is in progress
  }

  // Create and return handoff data
}

Übergabedaten erstellen

Damit alle relevanten und erforderlichen Daten bei der Übergabe mit der Funktion „Fortfahren“ weitergegeben werden, müssen Sie die Daten in das Objekt HandoffActivityData aufnehmen.

Die Klasse HandoffActivityData stellt die Übergabedaten dar, die mit einer Aktivität verknüpft sind. HandoffActivityData informiert „Weiter auf“ darüber, wie eine Aktivität auf dem Empfängergerät verarbeitet und neu erstellt werden soll. Die Übergabedaten umfassen:

  • Komponentenname (erforderlich): Der ComponentName einer entsprechenden Aktivität, die auf dem Empfängergerät gestartet werden soll, um die Nutzeraktivität nach der Übergabe fortzusetzen. In den meisten Fällen und für die genaue Replikation der Aktivität ist dies der Komponentenname für dieselbe Aktivität, die die HandoffActivityData erstellt.
  • Extras (optional): Sie können Extras angeben, die im Intent-Start der Aktivität enthalten sind. Dies ist ein PersistableBundle, mit dem der Komponente zusätzliche Informationen bereitgestellt werden können. Extras müssen kleiner als 50 KB sein.

Verwenden Sie zum Erstellen von HandoffActivityData-Objekten die Builder-Klasse HandoffActivityData.Builder. Erstelle einen neuen Builder, indem du die ComponentName der Aktivität übergibst, die die Übergabe erhalten soll (z. B. this.getComponentName für die aktuelle Activity oder eine explizite ComponentName(this, TargetActivity::class.java)). Verwende dann die Methode setExtras, um optional Extras anzugeben. Rufen Sie schließlich build auf, um das HandoffActivityData-Objekt zu erstellen.

// Override and implement onHandoffActivityDataRequested
override fun onHandoffActivityDataRequested(handoffRequestInfo: HandoffActivityDataRequestInfo) : HandoffActivityData {

  // Check whether the handoff request is active
  if (handoffRequestInfo.isActiveRequest()) {
    // Asynchronously show UI to let users know a handoff is in progress
  }

  val extras: PersistableBundle = PersistableBundle()
  // Put relevant and necessary values into extras (e.g. scroll position)
  extras.putString("data_id", getDataId())
  extras.putInt("scroll_position", getScrollPosition())

  // Create and return handoff data
  return HandoffActivityData.Builder(getComponentName()) // Designate handoff to the same activity
    .setExtras(extras)
    .build()
}

Web-Fallback-Option festlegen

Falls die angegebene Aktivität auf dem Empfängergerät nicht gestartet werden kann, können Sie mit setFallbackUri optional eine Fallback-URL festlegen, die auf dem Gerät im Standardbrowser des Nutzers geöffnet wird.

Wenn du möchtest, dass der Vorschlag „Auf anderem Gerät fortsetzen“ auf Empfangsgeräten angezeigt wird, auf denen deine App nicht installiert ist, übergib beim Aufrufen von setHandoffEnabled eine HandoffActivityParams-Instanz, wobei setAllowHandoffWithoutPackageInstalled auf true gesetzt ist:

setHandoffEnabled(
  true,
  HandoffActivityParams.Builder()
    .setAllowHandoffWithoutPackageInstalled(true)
    .build()
)

Fügen Sie dann die Fallback-URL in Ihre HandoffActivityData ein:

val fallbackWebLink: Uri = Uri.parse("https://myapp.com/fallback?query=" + paramVal)

val handoffData: HandoffActivityData = HandoffActivityData.Builder(getComponentName())
  .setExtras(extras)
  .setFallbackUri(fallbackWebLink)
  .build()

Direkt im Web implementieren

Alternativ können Sie für die Implementierung der direkten Übergabe an das Web HandoffActivityParams mit setAllowHandoffWithoutPackageInstalled(true) an setHandoffEnabled übergeben und die Methode HandoffActivityData.createWebHandoff verwenden, um die HandoffActivityData zu generieren:

val webHandoffLink: Uri = Uri.parse("https://myapp.com/handoff?query=" + paramVal)

val handoffData: HandoffActivityData = HandoffActivityData.createWebHandoff(webHandoffLink)

Übergabe-Intent empfangen und verarbeiten

Auf dem Empfängergerät muss deine App die Übergabe verarbeiten und die Nutzererfahrung vom Sendergerät wiederherstellen. In der Aktivität, die du im von onHandoffActivityDataRequested zurückgegebenen HandoffActivityData angegeben hast, musst du den Intent verarbeiten und die Extras abrufen, die Informationen dazu enthalten, wie die Aktivität angemessen neu erstellt werden kann.

Wenn du die Übergabe an dieselbe Aktivität angibst, kannst du den Intent in der onCreate-Methode der Aktivität empfangen, damit die Daten abgerufen und für den Nutzer entsprechend vorab ausgefüllt werden können.

class MyHandoffActivity : Activity() {

    ...

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // Do stuff
    ...

    // Get the launch intent and retrieve extras
    val intent: Intent = getIntent()
    if (intent != null && intent.hasExtra("data_id")) {
      val dataID: String = intent.getStringExtra("data_id")
      // Retrieve the data that corresponds to the data ID
      ...
      // Populate activity UI with relevant data
      ...

      if (intent.hasExtra("scroll_position")) {
        val scrollPosition: Int = intent.getIntExtra("scroll_position", 0)
        // Move the page to the scroll position
        ...
      }
    }
  }
}