SDK 執行階段對 SDK 啟動新活動的方式施加限制。這對全螢幕廣告格式來說是一大挑戰,一般必須分別啟動一個活動,才能進一步控管及改善使用者體驗。為解決這個問題,SDK 執行階段為沙箱活動推出了全新機制,
在 SDK 執行階段環境中載入的 SDK 無法直接在資訊清單中定義 <activity>
標記或啟動自己的活動。而是改為導入新的意圖動作 START_SANDBOXED_ACTIVITY
。
雖然 SDK 也不能使用此動作啟動意圖,但 SDK 可以要求用戶端應用程式啟動此意圖。接著,系統會建立平台定義的活動,並傳遞至 SDK。這個活動會在 SDK 相同的程序中執行。
這樣 SDK 就能利用這個活動,導入及管理全螢幕廣告體驗。
平台提供的活動是標準 android.app.Activity
,會在用戶端應用程式的任務中啟動。
在 SDK 執行階段上建立活動
建立活動的主要方法有兩種:使用簡化的 Jetpack Activity Library,或直接與 Platform API 互動。
建議您使用 Activity 程式庫,因為將基本概念抽象化,簡化活動建立程序。
活動程式庫
活動程式庫提供多項優點:
- 抽象化註冊活動處理常式的內部詳細資料,並與用戶端應用程式分享其 ID。
- 可讓應用程式開發人員設定符合的條件 (述詞),讓 SDK 能夠進一步控管 SDK 在應用程式內建立活動的方式。
- 為 SDK 定義用於定義啟動活動的 API。
活動程式庫有三種:核心、用戶端和提供者。
- core 程式庫會提供用戶端應用程式和提供者程式庫使用的介面。
- provider 程式庫提供可讓 SDK 啟動活動的 API。
- client 程式庫提供 API,讓用戶端應用程式建立活動啟動器,SDK 可用於要求應用程式啟動活動。
這些程式庫引入下列 API:
SdkActivityLauncher
:活動啟動器可讓 SDK 處理從用戶端應用程式的啟動活動。用戶端應用程式應建立啟動器,並以參數形式傳遞至 SDK 的 API 來啟動活動。<T : Activity & LifecycleOwner> T.createSdkActivityLauncher(() -> Boolean )
:這個擴充功能函式可供用戶端應用程式從活動呼叫以建立啟動器。SdkActivityLauncher.launchSdkActivity(IBinder)
:SDK 用於要求應用程式啟動活動的方法。
使用活動程式庫啟動活動的流程如下:
- SDK 會將
SdkActivityLauncher
類型的參數新增至任何會啟動活動的 API。 - 用戶端應用程式對其中一個活動呼叫
createSdkActivityLauncher
,建立啟動器,以便在 API 呼叫上傳遞至 SDK。 - SDK 會呼叫
SdkSandboxControllerCompat.registerSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat)
並擷取 ID 權杖。 - SDK 會呼叫
launchSdkActivity
來啟動活動。
下圖顯示使用活動程式庫時的流程。
平台 API
平台推出了下列 API,方便您在 SDK 執行階段中建立及管理沙箱活動:
SdkSandboxActivityHandler
:Activity 處理常式會用來在建立活動時通知 SDK,並由 SDK 註冊。- 為了協助註冊活動處理常式,SDK 可以在
SdkSandboxController
下使用以下方法:.registerSdkSandboxActivityHandler(SdkSandboxActivityHandler)
:註冊SdkSandboxActivityHandler
的執行個體,並傳回IBinder
ID。.unregisterSdkSandboxActivityHandler(SdkSandboxActivityHandler)
:使用 ID 取消註冊SdkSandboxActivityHandler
的已註冊例項。
SdkSandboxManager.startSdkSandboxActivity(Activity, IBinder)
:從用戶端應用程式叫用此方法,會觸發建立 SDK 的活動。用戶端應用程式必須將所選啟動 Activity 和 SDK 的 Activity Handler ID 傳遞為參數。
如要使用 Platform API 啟動活動,SDK 必須按照下列流程操作:
- SDK 使用提供的 API 註冊活動處理常式,並取得 ID。
- SDK 會與用戶端應用程式共用這個 ID。
- 用戶端應用程式會呼叫這個方法,使用平台 API
startSdkSandboxActivity(Activity, IBinder)
在 SDK 執行階段中啟動活動,並以參數為這個新活動選擇的啟動活動,以及活動處理常式的 ID。 - 平台會啟動 Activity,並透過 Activity Handler (
SdkSandboxActivityHandler.onActivityCreated(Activity)
) 中的回呼通知 SDK。 - SDK 會使用活動填入廣告。
使用 Platform API 可讓 SDK 在適當時機透過其 API,將 SdkSandboxActivityHandler 的 ID 分享給用戶端應用程式,並引導用戶端應用程式使用 ID。
在以下流程圖中,範例 SDK 中的 launchActivity(AppCallback)
方法會預期回呼 (定義為 SDK API 的一部分)。SDK 會使用這個回呼,將活動處理常式 (SdkSandboxActivityHandler
) 的 ID 分享給用戶端應用程式。
可視度
在 SDK 執行階段中,整合至用戶端應用程式檢視區塊階層的廣告會使用側邊管道,將來自 SDK 程序的 SDK 檢視畫面算繪到用戶端應用程式的處理程序。
由於廣告檢視畫面並未附加至應用程式視窗,因此 SDK 無法在 SDK 執行階段外使用相同的 View API,判斷是否要向使用者顯示廣告 (可視度)。
相反地,平台提供的活動會在 SDK 執行階段程序中原生執行,無需使用側邊管道,並允許 SDK 使用標準 Android Activity
和 View
API。
由於導入方式各不相同,因此無論廣告載入環境如何,持續致力統合介面,擷取可視度信號。
生命週期
透過 SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder)
傳遞至 SDK 的 ActivityHolder
會導入 LifecycleOwner
,並可用來瞭解 Lifecycle.Event
。
返回瀏覽
ActivityHolder.getOnBackPressedDispatcher()
方法會傳回 OnBackPressedDispatcher
,可用於註冊 OnBackPressedCallback
執行個體來處理返回瀏覽。