フルスクリーン広告のアクティビティのサポート

SDK ランタイムでは、SDK が新しいアクティビティを起動する方法に制限があります。そのため、コントロール性とユーザー エクスペリエンスを高めるために、個別のアクティビティを開始する必要があるフルスクリーン広告フォーマットには課題が生じます。これに対処するために、SDK ランタイムにはサンドボックス化されたアクティビティ用の新しいメカニズムが導入されています。

SDK ランタイム環境内で読み込まれた SDK では、マニフェスト内で <activity> タグを直接定義したり、独自のアクティビティを開始したりすることはできません。代わりに、新しいインテント アクション START_SANDBOXED_ACTIVITY が導入されています。

このアクションでインテントを起動することは SDK でも制限されますが、SDK はクライアント アプリにこのインテントを開始するようリクエストできます。すると、プラットフォーム定義のアクティビティが作成され、SDK に渡されます。このアクティビティは、SDK と同じプロセスで実行されます。

SDK はこのアクティビティを使用して、全画面広告エクスペリエンスを実装および管理できます。

プラットフォームが提供するアクティビティは、クライアント アプリのタスクの一部として起動される標準の android.app.Activity です。

SDK ランタイムでのアクティビティの作成

アクティビティを作成するには主に 2 つの方法があります。合理化された Jetpack アクティビティ ライブラリを使用する方法と、プラットフォーム API を直接操作する方法です。

アクティビティ ライブラリは、根本的な複雑さを取り除いてアクティビティの作成を簡素化するため、Google がおすすめします。

アクティビティ ライブラリ

アクティビティ ライブラリには、いくつかの利点があります。

  • アクティビティ ハンドラの登録と、クライアント アプリとの識別子の共有に関する内部の詳細を抽象化します。
  • 満たす条件(述語)を設定できるようにすることで、SDK がアプリ内でアクティビティを作成する方法をアプリ デベロッパーがより詳細に制御できるようになります。
  • アクティビティを起動する API を SDK で定義するための統一された方法を作成する。

アクティビティ ライブラリには、core、client、provider の 3 つがあります。

  • core ライブラリは、クライアント アプリとプロバイダ ライブラリで使用されるインターフェースを提供します。
  • provider ライブラリは、SDK がアクティビティを起動するための API を提供します。
  • クライアント ライブラリは、クライアント アプリがアクティビティ ランチャーを作成するための API を提供します。SDK は、このランチャーを使用して、アプリにアクティビティの起動を要求できます。

これらのライブラリでは、次の API が導入されています。

  • SdkActivityLauncher: アクティビティ ランチャーを使用すると、SDK でクライアント アプリからのアクティビティの起動を処理できます。クライアント アプリはランチャーを作成し、アクティビティを開始する SDK の API にパラメータとして渡す必要があります。
  • <T : Activity & LifecycleOwner> T.createSdkActivityLauncher(() -> Boolean ): クライアント アプリがアクティビティから呼び出してランチャーを作成できる拡張関数。
  • SdkActivityLauncher.launchSdkActivity(IBinder): アプリにアクティビティの起動をリクエストするために SDK によって使用されるメソッド。

アクティビティ ライブラリを使用してアクティビティを起動するフローは次のとおりです。

  1. この SDK は、アクティビティを開始するすべての API に SdkActivityLauncher 型のパラメータを追加します。
  2. クライアント アプリのアクティビティの 1 つで createSdkActivityLauncher を呼び出して、API 呼び出しで SDK に渡すことができるランチャーを作成します。
  3. SDK は SdkSandboxControllerCompat.registerSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat) を呼び出して、識別子トークンを取得します。
  4. SDK が launchSdkActivity を呼び出してアクティビティを起動します。

次の図は、アクティビティ ライブラリを使用する場合のフローを示しています。

アクティビティ ライブラリのシーケンス図
アクティビティ ライブラリを使用してアクティビティを開始するフローを示すシーケンス図。

プラットフォーム API

プラットフォームには、SDK ランタイム内のサンドボックス化されたアクティビティの作成と管理を容易にする次の API が導入されています。

Platform API を使用してアクティビティを開始するには、SDK を次のフローに沿って操作する必要があります。

  1. SDK は、提供された API を使用してアクティビティ ハンドラを登録し、識別子を取得します。
  2. SDK はこの ID をクライアント アプリと共有します。
  3. クライアント アプリは、プラットフォームの API startSdkSandboxActivity(Activity, IBinder) を使用して SDK ランタイムのアクティビティを開始するメソッドを呼び出し、この新しいアクティビティ用に選択された開始アクティビティとアクティビティ ハンドラの識別子をパラメータとして渡します。
  4. プラットフォームがアクティビティを開始し、アクティビティ ハンドラ(SdkSandboxActivityHandler.onActivityCreated(Activity))内のコールバックを通じて SDK に通知します。
  5. SDK はアクティビティを使用して広告を表示します。

Platform API を使用すると、SDK は適切なタイミングで API を介してクライアント アプリと SdkSandboxActivityHandler の ID を共有し、クライアント アプリの使用方法をガイドします。

次のフロー図では、サンプル SDK の launchActivity(AppCallback) メソッドでコールバックが想定されています(SDK の API の一部として定義)。このコールバックは、SDK がアクティビティ ハンドラ(SdkSandboxActivityHandler)の ID をクライアント アプリと共有するために使用されます。

Platform API のシーケンス図
プラットフォームの API を使用してアクティビティを開始するフローを示すシーケンス図。

視認性

SDK ランタイム内では、クライアント アプリのビュー階層に統合された広告は、サイドチャネルを使用して、SDK プロセスからクライアント アプリのプロセスに SDK ビューをレンダリングします。

SDK は、SDK ランタイムの外部で使用する場合と同じ View API を使用して、広告がユーザーに表示されるかどうかを判断することはできません。広告ビューはアプリのウィンドウ(視認性)にアタッチされていないためです。

これに対して、プラットフォームが提供するアクティビティは SDK ランタイム プロセス内でネイティブに実行されるため、サイドチャネルが不要になり、SDK で標準の Android Activity API と View API を使用できるようになります。

こうした実装の違いから、広告の読み込みのコンテキストに関係なく、インターフェースを統合して視認性シグナルを取得する継続的な取り組みが行われています。

ライフサイクル

SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder) を介して SDK に渡される ActivityHolderLifecycleOwner を実装し、Lifecycle.Event の認識に使用できます。

「戻る」ナビゲーション

メソッド ActivityHolder.getOnBackPressedDispatcher()OnBackPressedDispatcher を返します。これを使用して、OnBackPressedCallback インスタンスを登録して「戻る」ナビゲーションを処理できます。