Aktivitätsunterstützung für Vollbildanzeigen

Die SDK-Laufzeit schränkt ein, wie SDKs neue Aktivitäten starten können. Das stellt eine Herausforderung für Vollbildanzeigenformate dar, die in der Regel eine separate Aktivität starten, um die Kontrolle und Nutzerfreundlichkeit zu verbessern. Um dieses Problem zu beheben, wird in der SDK-Laufzeit ein neuer Mechanismus für Sandbox-Aktivitäten eingeführt.

SDKs, die in der SDK-Laufzeitumgebung geladen werden, können <activity>-Tags nicht direkt in ihrem Manifest definieren oder eigene Aktivitäten starten. Stattdessen wird die neue Intent-Aktion START_SANDBOXED_ACTIVITY eingeführt.

SDKs dürfen zwar keine Intents mit dieser Aktion starten, sie können aber die Client-App auffordern, diesen Intent zu starten. Das System erstellt dann eine plattformdefinierte Aktivität und übergibt sie an das SDK. Diese Aktivität wird im selben Prozess wie das SDK ausgeführt.

Das SDK kann diese Aktivität dann verwenden, um die Vollbildanzeige zu implementieren und zu verwalten.

Die von der Plattform bereitgestellte Aktivität ist ein Standard-android.app.Activity, der als Teil der Aufgabe der Client-App gestartet wird.

Activity-Erstellung in der SDK-Laufzeit

Es gibt zwei primäre Methoden zum Erstellen von Aktivitäten: die Verwendung der optimierten Jetpack-Activity-Bibliotheken oder die direkte Interaktion mit Plattform-APIs.

Wir empfehlen die Verwendung von Aktivitätsbibliotheken, da sie die Erstellung von Aktivitäten vereinfachen, indem sie die zugrunde liegende Komplexität abstrahieren.

Aktivitätenbibliotheken

Aktivitätsbibliotheken bieten mehrere Vorteile:

  • Die internen Details der Registrierung von Aktivitätshandlern und der Weitergabe ihrer Kennungen an Client-Apps werden abstrahiert.
  • App-Entwickler haben dadurch mehr Kontrolle darüber, wie SDKs Aktivitäten in ihren Apps erstellen, da sie Bedingungen (Prädikate) festlegen können, die erfüllt sein müssen.
  • Eine einheitliche Methode für SDKs schaffen, um APIs zu definieren, die Aktivitäten starten.

Es gibt drei Aktivitätsbibliotheken: „core“, „client“ und „provider“.

  • Die core-Bibliothek enthält die Schnittstellen, die von Client-Apps und Anbieterbibliotheken verwendet werden.
  • Die provider-Bibliothek stellt APIs für SDKs zum Starten von Aktivitäten bereit.
  • Die Clientbibliothek bietet APIs für Client-Apps zum Erstellen eines Aktivitäts-Launchers, mit dem SDKs Apps auffordern können, Aktivitäten zu starten.

Diese Bibliotheken führen die folgenden APIs ein:

Der Ablauf beim Starten von Aktivitäten mit Aktivitätsbibliotheken sieht so aus:

  1. Das SDK fügt allen APIs, die Aktivitäten starten, einen Parameter vom Typ SdkActivityLauncher hinzu.
  2. Die Client-App ruft createSdkActivityLauncher in einer ihrer Aktivitäten auf, um einen Launcher zu erstellen, der bei API-Aufrufen an das SDK übergeben werden kann.
  3. Das SDK ruft SdkSandboxControllerCompat.registerSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat) auf und ruft das Kennungstoken ab.
  4. Das SDK ruft launchSdkActivity auf, um die Aktivität zu starten.
zurückgeben lassen.

Das folgende Diagramm zeigt den Ablauf bei Verwendung von Aktivitätsbibliotheken.

Sequenzdiagramm der Aktivitätsbibliothek
Sequenzdiagramm, das den Ablauf beim Starten einer Aktivität mit Aktivitätsbibliotheken zeigt.

Plattform-APIs

Die Plattform führt die folgenden APIs ein, um die Erstellung und Verwaltung von Sandbox-Aktivitäten in der SDK Runtime zu erleichtern:

Wenn Sie eine Aktivität über die Plattform-APIs starten möchten, müssen die SDKs diesem Ablauf folgen:

  1. Das SDK registriert einen Aktivitätshandler mit den bereitgestellten APIs und ruft eine Kennung ab.
  2. Das SDK gibt diesen Identifier an die Client-App weiter.
  3. Die Client-App ruft die Methode zum Starten einer Aktivität in der SDK-Laufzeit mit der Plattform-API startSdkSandboxActivity(Activity, IBinder) auf und übergibt als Parameter die ausgewählte Startaktivität für diese neue Aktivität und die Kennung des Activity-Handlers.
  4. Die Plattform startet eine Aktivität und benachrichtigt das SDK über einen Callback im Activity Handler (SdkSandboxActivityHandler.onActivityCreated(Activity)).
  5. Das SDK verwendet die Aktivität, um sie mit einer Anzeige zu füllen.

Wenn Sie Plattform-APIs verwenden, ist das SDK dafür verantwortlich, die ID von SdkSandboxActivityHandler über seine APIs zu einem geeigneten Zeitpunkt an die Client-App weiterzugeben und Client-Apps bei der Verwendung zu unterstützen.

Im folgenden Flussdiagramm hat das Beispiel-SDK eine Methode launchActivity(AppCallback), die einen Callback erwartet (der als Teil der API des SDK definiert ist). Dieser Callback wird vom SDK verwendet, um die ID des Activity-Handlers (SdkSandboxActivityHandler) mit der Client-App zu teilen.

Sequenzdiagramm für Plattform-APIs
Ablaufdiagramm für den Start einer Aktivität über Plattform-APIs.

Sichtbarkeit

In der SDK Runtime werden Anzeigen, die in die Ansichtshierarchie der Client-App eingebunden sind, über Seitenkanäle gerendert. Dabei werden SDK-Ansichten aus dem SDK-Prozess in den Prozess der Client-App übertragen.

Das SDK kann nicht dieselben View-APIs verwenden wie außerhalb der SDK-Laufzeit, um festzustellen, ob die Anzeige für den Nutzer sichtbar ist, da die Anzeigenansicht nicht mit dem Fenster der Anwendung verknüpft ist (Sichtbarkeit).

Die von der Plattform bereitgestellte Aktivität wird dagegen nativ im SDK Runtime-Prozess ausgeführt. Dadurch sind keine Side-Channels erforderlich und SDKs können die Standard-APIs Activity und View von Android verwenden.

Aufgrund dieser unterschiedlichen Implementierungen wird derzeit daran gearbeitet, die Schnittstellen zum Abrufen der Sichtbarkeitssignale unabhängig vom Kontext des Anzeigenaufrufs zu vereinheitlichen.

Lifecycle

Die ActivityHolder, die über SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder) an das SDK übergeben wird, implementiert LifecycleOwner und kann verwendet werden, um Informationen zu Lifecycle.Event zu erhalten.

Rückwärtsnavigation

Die Methode ActivityHolder.getOnBackPressedDispatcher() gibt OnBackPressedDispatcher zurück, mit der OnBackPressedCallback-Instanzen für die Verarbeitung der Rückwärtsnavigation registriert werden können.