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 によって使用されるメソッド。
アクティビティ ライブラリを使用してアクティビティを起動するフローは次のとおりです。
- この SDK は、アクティビティを開始するすべての API に
SdkActivityLauncher
型のパラメータを追加します。 - クライアント アプリのアクティビティの 1 つで
createSdkActivityLauncher
を呼び出して、API 呼び出しで SDK に渡すことができるランチャーを作成します。 - SDK は
SdkSandboxControllerCompat.registerSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat)
を呼び出して、識別子トークンを取得します。 - SDK が
launchSdkActivity
を呼び出してアクティビティを起動します。
次の図は、アクティビティ ライブラリを使用する場合のフローを示しています。
プラットフォーム API
プラットフォームには、SDK ランタイム内のサンドボックス化されたアクティビティの作成と管理を容易にする次の API が導入されています。
SdkSandboxActivityHandler
: アクティビティ ハンドラは、アクティビティが作成されたときに SDK に通知するために使用され、SDK によって登録されます。- アクティビティ ハンドラの登録をサポートするために、SDK では
SdkSandboxController
で次のメソッドを使用できます。.registerSdkSandboxActivityHandler(SdkSandboxActivityHandler)
:IBinder
識別子を返すSdkSandboxActivityHandler
のインスタンスを登録します。.unregisterSdkSandboxActivityHandler(SdkSandboxActivityHandler)
: 識別子を使用してSdkSandboxActivityHandler
の登録済みインスタンスの登録を解除します。
SdkSandboxManager.startSdkSandboxActivity(Activity, IBinder)
: クライアント アプリから呼び出され、SDK のアクティビティの作成をトリガーします。クライアント アプリは、選択した開始アクティビティと SDK のアクティビティ ハンドラ識別子をパラメータとして渡す必要があります。
Platform API を使用してアクティビティを開始するには、SDK を次のフローに沿って操作する必要があります。
- SDK は、提供された API を使用してアクティビティ ハンドラを登録し、識別子を取得します。
- SDK はこの ID をクライアント アプリと共有します。
- クライアント アプリは、プラットフォームの API
startSdkSandboxActivity(Activity, IBinder)
を使用して SDK ランタイムのアクティビティを開始するメソッドを呼び出し、この新しいアクティビティ用に選択された開始アクティビティとアクティビティ ハンドラの識別子をパラメータとして渡します。 - プラットフォームがアクティビティを開始し、アクティビティ ハンドラ(
SdkSandboxActivityHandler.onActivityCreated(Activity)
)内のコールバックを通じて SDK に通知します。 - SDK はアクティビティを使用して広告を表示します。
Platform API を使用すると、SDK は適切なタイミングで API を介してクライアント アプリと SdkSandboxActivityHandler の ID を共有し、クライアント アプリの使用方法をガイドします。
次のフロー図では、サンプル SDK の launchActivity(AppCallback)
メソッドでコールバックが想定されています(SDK の API の一部として定義)。このコールバックは、SDK がアクティビティ ハンドラ(SdkSandboxActivityHandler
)の ID をクライアント アプリと共有するために使用されます。
視認性
SDK ランタイム内では、クライアント アプリのビュー階層に統合された広告は、サイドチャネルを使用して、SDK プロセスからクライアント アプリのプロセスに SDK ビューをレンダリングします。
SDK は、SDK ランタイムの外部で使用する場合と同じ View API を使用して、広告がユーザーに表示されるかどうかを判断することはできません。広告ビューはアプリのウィンドウ(視認性)にアタッチされていないためです。
これに対して、プラットフォームが提供するアクティビティは SDK ランタイム プロセス内でネイティブに実行されるため、サイドチャネルが不要になり、SDK で標準の Android Activity
API と View
API を使用できるようになります。
こうした実装の違いから、広告の読み込みのコンテキストに関係なく、インターフェースを統合して視認性シグナルを取得する継続的な取り組みが行われています。
ライフサイクル
SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder)
を介して SDK に渡される ActivityHolder
は LifecycleOwner
を実装し、Lifecycle.Event
の認識に使用できます。
「戻る」ナビゲーション
メソッド ActivityHolder.getOnBackPressedDispatcher()
は OnBackPressedDispatcher
を返します。これを使用して、OnBackPressedCallback
インスタンスを登録して「戻る」ナビゲーションを処理できます。