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