SDK 런타임은 SDK가 새 활동을 실행하는 방식을 제한합니다. 이는 일반적으로 향상된 제어 및 사용자 환경을 위해 별도의 활동을 시작하는 전체 화면 광고 형식에 문제가 됩니다. 이 문제를 해결하기 위해 SDK 런타임에서는 샌드박스 처리된 활동을 위한 새로운 메커니즘을 도입합니다.
SDK 런타임 환경 내에서 로드된 SDK는 매니페스트에서 <activity> 태그를 직접 정의하거나 자체 활동을 시작할 수 없습니다.
대신 새로운 인텐트 작업인 START_SANDBOXED_ACTIVITY가 도입되었습니다.
SDK도 이 작업으로 인텐트를 실행할 수 없지만 SDK는 클라이언트 앱에 이 인텐트를 시작하도록 요청할 수 있습니다. 그러면 시스템에서 플랫폼 정의 활동을 만들어 SDK에 전달합니다. 이 활동은 SDK와 동일한 프로세스에서 실행됩니다.
그러면 SDK가 이 활동을 사용하여 전체 화면 광고 환경을 구현하고 관리할 수 있습니다.
플랫폼에서 제공하는 활동은 클라이언트 앱 작업의 일부로 실행되는 표준 android.app.Activity입니다.
SDK 런타임의 활동 생성
활동을 만드는 방법에는 두 가지가 있습니다. 간소화된 Jetpack 활동 라이브러리를 사용하거나 플랫폼 API와 직접 상호작용하는 것입니다.
활동 라이브러리는 기본 복잡성을 추상화하여 활동 생성을 간소화하므로 활동 라이브러리를 사용하는 것이 좋습니다.
활동 라이브러리
활동 라이브러리는 다음과 같은 여러 이점을 제공합니다.
- 활동 핸들러를 등록하고 식별자를 클라이언트 앱과 공유하는 내부 세부정보를 추상화합니다.
- 앱 개발자가 충족해야 하는 조건 (프레디케이트)을 설정할 수 있도록 하여 SDK가 앱 내에서 활동을 만드는 방식을 더 세부적으로 제어할 수 있습니다.
- SDK가 활동을 실행하는 API를 정의하는 통합된 방법 만들기
활동 라이브러리에는 핵심, 클라이언트, 제공자라는 세 가지가 있습니다.
- core 라이브러리는 클라이언트 앱과 제공자 라이브러리에서 사용되는 인터페이스를 제공합니다.
- 제공자 라이브러리는 SDK가 활동을 실행할 수 있는 API를 제공합니다.
- 클라이언트 라이브러리는 클라이언트 앱이 활동 런처를 만들 수 있는 API를 제공하며, SDK는 이를 사용하여 앱에 활동 실행을 요청할 수 있습니다.
이러한 라이브러리는 다음 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: 활동 핸들러는 활동이 생성될 때 SDK에 알리는 데 사용되며 SDK에 의해 등록됩니다.- 활동 핸들러 등록을 지원하기 위해 SDK는
SdkSandboxController에서 다음 메서드를 사용할 수 있습니다..registerSdkSandboxActivityHandler(SdkSandboxActivityHandler):SdkSandboxActivityHandler인스턴스를 등록하여IBinder식별자를 반환합니다..unregisterSdkSandboxActivityHandler(SdkSandboxActivityHandler): 식별자를 사용하여 등록된SdkSandboxActivityHandler인스턴스를 등록 해제합니다.
SdkSandboxManager.startSdkSandboxActivity(Activity, IBinder): 클라이언트 앱에서 호출되는 이 메서드는 SDK의 활동 생성을 트리거합니다. 클라이언트 앱은 선택한 시작 활동과 SDK의 활동 핸들러 식별자를 매개변수로 전달해야 합니다.
플랫폼 API를 사용하여 활동을 시작하려면 SDK가 다음 흐름을 따라야 합니다.
- SDK는 제공된 API를 사용하여 활동 핸들러를 등록하고 식별자를 획득합니다.
- SDK는 이 식별자를 클라이언트 앱과 공유합니다.
- 클라이언트 앱은 플랫폼 API
startSdkSandboxActivity(Activity, IBinder)로 SDK 런타임에서 활동을 시작하는 메서드를 호출하여 이 새 활동에 대해 선택된 시작 활동과 활동 핸들러의 식별자를 파라미터로 전달합니다. - 플랫폼은 활동을 시작하고 활동 핸들러 (
SdkSandboxActivityHandler.onActivityCreated(Activity))의 콜백을 통해 SDK에 알립니다. - SDK는 활동을 사용하여 광고를 채웁니다.
플랫폼 API를 사용하면 SDK가 적절한 시기에 API를 통해 SdkSandboxActivityHandler의 식별자를 클라이언트 앱과 공유하고 클라이언트 앱이 이를 사용하는 방법을 안내합니다.
다음 흐름 다이어그램에서 예시 SDK에는 콜백을 예상하는 launchActivity(AppCallback) 메서드가 있습니다 (SDK API의 일부로 정의됨). 이 콜백은 SDK가 활동 핸들러 (SdkSandboxActivityHandler)의 식별자를 클라이언트 앱과 공유하는 데 사용됩니다.
조회가능성
SDK 런타임 내에서 클라이언트 앱의 뷰 계층 구조에 통합된 광고는 사이드 채널을 사용하여 SDK 프로세스에서 클라이언트 앱의 프로세스로 SDK 뷰를 렌더링합니다.
SDK는 광고가 사용자에게 표시되는지 확인하기 위해 SDK 런타임 외부에서 사용하는 것과 동일한 View API를 사용할 수 없습니다. 광고 뷰가 애플리케이션의 창에 연결되어 있지 않기 때문입니다(조회 가능성).
반면 플랫폼에서 제공하는 활동은 SDK 런타임 프로세스 내에서 네이티브로 실행되므로 측면 채널이 필요하지 않으며 SDK가 표준 Android Activity 및 View API를 사용할 수 있습니다.
이러한 다양한 구현으로 인해 광고 로드 컨텍스트와 관계없이 조회 가능성 신호를 가져오는 인터페이스를 통합하기 위한 지속적인 노력이 필요합니다.
Lifecycle
SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder)을 통해 SDK에 전달된 ActivityHolder는 LifecycleOwner를 구현하며 Lifecycle.Event에 관해 알 수 있습니다.
뒤로 탐색
ActivityHolder.getOnBackPressedDispatcher() 메서드는 뒤로 탐색을 처리하기 위해 OnBackPressedCallback 인스턴스를 등록하는 데 사용할 수 있는 OnBackPressedDispatcher를 반환합니다.