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

SDK ランタイムでは、SDK が新しいアクティビティを起動する方法に制限が設けられています。これは、通常、制御とユーザー エクスペリエンスの向上のために別のアクティビティの開始に依存する全画面広告フォーマットにとって課題となります。これに対処するため、SDK ランタイムにはサンドボックス化されたアクティビティ用の新しいメカニズムが導入されています。

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

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

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

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

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

アクティビティを作成する主な方法は 2 つあります。効率的な Jetpack のActivity ライブラリを使用する方法と、Platform API を直接操作する方法です。

アクティビティ ライブラリを使用することをおすすめします。アクティビティ ライブラリは、基盤となる複雑さを抽象化することで、アクティビティの作成を簡素化します。

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

アクティビティ ライブラリには次のようなメリットがあります。

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

アクティビティ ライブラリは、コア、クライアント、プロバイダの 3 つがあります。

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

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

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

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

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

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

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

プラットフォーム API

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

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

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

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

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

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

視認性

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

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

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

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

Lifecycle

SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder) を介して SDK に渡される ActivityHolderLifecycleOwner を実装し、Lifecycle.Event に関する情報を取得するために使用できます。

「戻る」ナビゲーション

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