全屏广告的 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 库

activity 库具有以下优势:

  • 抽象化注册 activity 处理程序以及与客户端应用共享其标识符的内部详细信息。
  • 通过允许应用开发者设置要满足的条件(谓词),使应用开发者能够更好地控制 SDK 在其应用内创建 activity 的方式。
  • 为 SDK 创建一种统一的方式来定义启动 activity 的 API。

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

  • core 库提供客户端应用和提供方库使用的接口。
  • provider 库为 SDK 提供用于启动 activity 的 API。
  • client 库为客户端应用提供用于创建 activity 启动器的 API,SDK 可以使用该启动器请求应用启动 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。

由于存在这些不同的实现,我们正致力于统一接口,以便检索可见度信号,而不考虑广告加载上下文。

生命周期

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

返回导航

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