全屏广告的 activity 支持

SDK 运行时对 SDK 启动新 activity 的方式施加了限制。这给全屏广告格式带来了挑战,因为全屏广告格式通常依赖于启动单独的 activity 来增强控制和用户体验。为了解决这个问题,SDK 运行时为沙盒 activity 引入了一种新颖的机制。

在 SDK 运行时环境中加载的 SDK 无法在其清单中直接定义 <activity> 标记,也无法启动自己的 activity。 我们引入了一个新的 intent 操作 START_SANDBOXED_ACTIVITY

虽然 SDK 也受到限制,无法启动具有此操作的 intent,但 SDK 可以请求客户端应用启动此 intent。然后,系统会创建一个平台定义的 activity 并将其传递给 SDK。此 activity 将在与 SDK 相同的进程中运行。

然后,SDK 可以使用此 activity 来实现和管理全屏广告体验。

平台提供的 activity 是标准 android.app.Activity,作为客户端应用任务的一部分启动。

SDK 运行时上的 activity 创建

您可以通过两种主要方法来创建 activity:使用简化的 Jetpack Activity 库或直接与平台 API 互动。

我们建议使用 Activity 库,因为它们通过抽象化底层复杂性来简化 activity 创建。

活动库

活动库具有以下几项优势:

  • 抽象化了注册 activity 处理程序并与客户端应用分享其标识符的内部细节。
  • 让应用开发者能够通过设置要满足的条件(谓词)来更好地控制 SDK 在其应用中创建 activity 的方式。
  • 为 SDK 提供一种统一的方式来定义启动 activity 的 API。

有三个 activity 库:核心库、客户端库和提供方库。

  • 核心库提供客户端应用和提供方库使用的接口。
  • 提供方库提供用于启动 activity 的 SDK API。
  • 客户端库为客户端应用提供了用于创建 activity 启动器的 API,SDK 可以使用这些 API 来请求应用启动 activity。

这些库引入了以下 API:

使用 activity 库启动 activity 的流程如下:

  1. SDK 会向任何将启动 activity 的 API 添加 SdkActivityLauncher 类型的参数。
  2. 客户端应用在其某个 activity 上调用 createSdkActivityLauncher 以创建一个启动器,该启动器可在 API 调用时传递给 SDK。
  3. SDK 会调用 SdkSandboxControllerCompat.registerSdkSandboxActivityHandler(SdkSandboxActivityHandlerCompat) 并检索标识符令牌。
  4. SDK 会调用 launchSdkActivity 来启动 activity。

下图显示了使用 activity 库时的流程。

activity 库序列图
显示使用 activity 库启动 activity 的流程的序列图。

平台 API

平台引入了以下 API,以方便在 SDK 运行时中创建和管理沙盒 activity:

如需使用平台 API 启动 activity,SDK 必须遵循以下流程:

  1. SDK 使用提供的 API 注册 activity 处理程序,并获取标识符。
  2. SDK 会与客户端应用分享此标识符。
  3. 客户端应用调用该方法以使用平台 API startSdkSandboxActivity(Activity, IBinder) 在 SDK 运行时中启动 activity,并传递所选的此新 activity 的起始 activity 和 activity 处理程序的标识符作为参数。
  4. 平台启动 activity,并通过 activity 处理程序 (SdkSandboxActivityHandler.onActivityCreated(Activity)) 中的回调通知 SDK。
  5. SDK 会使用该 activity 来填充广告。

使用平台 API 会使 SDK 负责在适当的时间通过其 API 与客户端应用共享 SdkSandboxActivityHandler 的标识符,并指导客户端应用如何使用该标识符。

在以下流程图中,示例 SDK 具有一个方法 launchActivity(AppCallback),该方法需要一个回调(定义为 SDK 的 API 的一部分)。SDK 使用此回调与客户端应用分享 Activity 处理程序 (SdkSandboxActivityHandler) 的标识符。

平台 API 序列图
显示使用平台 API 启动 activity 的流程的序列图。

可见度

在 SDK 运行时内,集成到客户端应用视图层次结构中的广告使用边信道将 SDK 视图从 SDK 进程渲染到客户端应用的进程。

SDK 无法使用与它在 SDK 运行时外部使用的相同 View API 来确定是否要向用户展示广告,因为广告视图不会附加到应用窗口(可视性)。

相比之下,平台提供的 activity 在 SDK 运行时进程中以原生方式运行,无需使用边信道,并允许 SDK 使用标准 Android ActivityView API。

由于这些实现方式各不相同,我们一直在努力统一用于检索可视性信号的接口,无论广告加载上下文如何。

Lifecycle

通过 SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder) 传递给 SDK 的 ActivityHolder 实现 LifecycleOwner,可用于了解 Lifecycle.Event

返回导航

方法 ActivityHolder.getOnBackPressedDispatcher() 会返回 OnBackPressedDispatcher,可用于注册 OnBackPressedCallback 实例来处理返回导航。