Çalışma Zamanı Etkinleştirilmiş SDK derleme ve kullanma

1
Key concepts
2
Set up your development environment
3
Build an RE SDK
4
Consume the RE SDK
5
Testing, and building for distribution

Çalışma zamanı özellikli SDK'yı kullanma

Bu bölümde, istemcilerin, bildirilen çalışma zamanı etkin (RE) SDK API'leriyle nasıl etkileşime girebileceği açıklanmaktadır.

Bu kılavuzda, mevcut SDK modülünüz (veya çalışma zamanı farkında olan SDK) istemci olarak adlandırılır.

Çalışma zamanı özellikli SDK'yı doğrudan uygulamanıza eklemek istiyorsanız uygulama modülü istemcidir.

Çalışma zamanı özellikli SDK'yı yükleyin

Çalışma zamanı özellikli SDK'nızda veya istemci uygulamanızda ilk olarak çalışma zamanı özellikli SDK'yı yüklemeniz gerekir.

SdkSandboxManager sınıfı, çalışma zamanı etkin SDK'ların yüklenmesine yardımcı olur ve çalışma zamanı etkin SDK'da bildirilen arayüze çalışma zamanı uyumlu SDK'nın bağlayabileceği bir IBinder sınıfı döndürür.

Çalışma zamanı etkin her SDK'yı yalnızca bir kez yüklediğinizden emin olmanız gerekir. Aksi takdirde SDK yöneticisi bir istisna döndürür.

Shim oluşturma araçları, IBinder SdkSandboxManager tarafından döndürülen arayüzü, bildirilen SDK API arayüzüne dönüştürmek için yardımcı sınıflar oluşturur.

Araçlar, @PrivacySandboxService ile açıklama eklenmiş arayüzü kullanarak *Factory sınıfı oluşturur.

Bu sınıf, wrapTo* nesnesini, çalışma zamanı etkin SDK'nızın arayüzünün bir örneğine dönüştüren statik bir IBinder işlevi içerir.

Çalışma zamanı uyumlu SDK'nız bu arayüzü kullanarak çalışma zamanı etkin SDK ile iletişim kurabilir ve önceki adımda bildirdiğiniz SDK API'lerini çağırabilir.

// Name of the SDK to be loaded, defined in your ASB module
private const val SDK_NAME = "com.example.sdk"

try {
    // SdkSandboxManagerCompat is used to communicate with the sandbox and load SDKs with backward compatibility.
    val sandboxManagerCompat = SdkSandboxManagerCompat.from(context)
    val sandboxedSdk = sandboxManagerCompat.loadSdk(SDK_NAME, Bundle.EMPTY)
    val mySdk = MySdkFactory.wrapToMySdk(sandboxedSdk.getInterface()!!)
} catch (e: LoadSdkCompatException) {
    Log.e(TAG, "Failed to load SDK, error code: ${e.loadSdkErrorCode}", e)
    return null
}

Kullanıcı arayüzü kitaplığı kullanımı

Reklamları göstermek için kullanıcı arayüzü kitaplığını kullanmak istiyorsanız çalışma zamanına duyarlı SDK'nızın build.gradle dosyasındaki bağımlılıklara androidx.privacysandbox.ui:ui-core ve androidx.privacysandbox.ui:ui-client eklediğinizden emin olun.

SandboxedSdkView kullanarak banner reklam yükleme

androidx.privacysandbox.ui:ui-client, çalışma zamanı etkin bir SDK tarafından oluşturulan kullanıcı arayüzünü barındırmak için SandboxedSdkView adlı yeni bir ViewGroup sunuyor.

setAdapter(), reklam görüntülemeyi ve kullanıcı arayüzü değişiklikleriyle ilgili bildirimleri almak için çalışma zamanı etkin SDK ile bir oturum açar. SDK oturumu açtığında reklam gösterilir.

Bu, aşağıdaki gibi entegre edilebilir:

class BannerAd(context: Context, attrs: AttributeSet) : LinearLayout(context, attrs) {
    suspend fun loadAd() {
        // mySdk is the previously loaded SDK in the SDK Runtime.
        val bannerAd = mySdk.loadAd()
        val sandboxedSdkView = SandboxedSdkView(context)
        addViewToLayout(sandboxedSdkView)

        // This renders the ad.
        sandboxedSdkView.setAdapter(bannerAd)
        return
    }
    private fun addViewToLayout(view: View) {
        view.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
        super.addView(view)
    }
}

Çalışma zamanı konusunda bilgi sahibi SDK'nız, oturum durumu kullanıcı arayüzü sunumu için değiştiğinde de bildirim alabilir. Bunu yapmak için:

  1. Farklı senaryoları işlemek için SessionStateChangeListener() sınıfı oluşturun:

    private class SessionStateChangeListener() : SandboxedSdkUiSessionStateChangedListener {
        override fun onStateChanged(state: SandboxedSdkUiSessionState) {
            if (state is SandboxedSdkUiSessionState.Error) {
            // Some error has occurred while opening the session. Handle
            // accordingly.
            Log.e(TAG, state.throwable.message!!);
            } else if (state is SandboxedSdkUiSessionState.Loading) {
                // The session is attempting to be opened.
            } else if (state is SandboxedSdkUiSessionState.Active) {
                // The session is open and the UI presentation was successful.
            } else if (state is SandboxedSdkUiSessionState.Idle) {
                // There is no open session.
            }
        }
    }
    
  2. Daha önce oluşturduğunuz SandboxedSdkView öğesine durum değişikliği dinleyicisi ekleyin. Dinleyici, görünüme eklendiği anda mevcut durumla birlikte hemen çağrılır.

Aşağıdakileri göz önünde bulundurun:

  • Çalışma zamanına duyarlı SDK, oturum açılma işlemi henüz tamamlanmamışken SandboxedSdkView yöntemlerini çağırırsa tüm efektler oturum açılma işlemi tamamlandıktan sonra uygulanır.
    • SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop) gibi yöntemler
  • SandboxedSdkView öğesine görünüm ekleyen veya bu öğeden görünüm kaldıran yöntemler (ör. addView(), removeView(), removeViewAt() vb.) desteklenmez ve UnsupportedOperationException hatası verilir.
    • Reklamı göstermek için yalnızca setAdapter() kullanın.
  • SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop), Z sıralamasını değiştirir. Bu, kullanıcı etkileşiminden gelen MotionEvents öğelerinin çalışma zamanı özelliğinin etkin olduğu SDK'ya mı yoksa çalışma zamanı özelliğinin etkin olduğu SDK'ya mı gönderileceğini etkiler.

Etkinlikleri başlatma

Çalışma zamanı özellikli SDK'ya ait etkinlikleri başlatmak için çalışma zamanı özellikli SDK'da başlatıcı oluşturmak üzere createSdkActivityLauncher uzantısını kullanın.

Bu başlatıcı daha sonra çalışma zamanı özellikli SDK'nıza iletilebilir ve SDK'nın gerektiğinde etkinlik başlatmasına olanak tanır.

Etkinliğin başlatılıp başlatılmayacağını kontrol etmek için bir yüklem kullanabilirsiniz. Etkinliklere izin verilmesi için koşulun true değeri döndürmesi gerekir.

val launchSdkActivityPredicate = {
    // Boolean which has to be true to launch the activities
    }
val launcher = baseActivity.createSdkActivityLauncher(launchSdkActivityPredicate)
fullscreenService.showActivity(launcher)

Çalışma zamanı özellikli SDK'nızda SdkSandboxActivityHandlerCompat öğesini kaydedin ve SdkActivityLauncher.LaunchSdkActivity(IBinder) öğesine sağlayın.

fun showActivity(activityLauncher: SdkActivityLauncher) {
    val handler = object : SdkSandboxActivityHandlerCompat {
        override fun onActivityCreated(activityHolder: ActivityHolder) {
            activityHolder.getActivity().setContentView(contentView)
        }
    }

    val token = controller.registerSdkSandboxActivityHandler(handler)
    activityLauncher.launchSdkActivity(token)
}

ActivityHolder öğesine iletilen SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder), LifecycleOwner öğesini uygular. Bu sayede, çalışma zamanı özellikli SDK'nız etkinliğin yaşam döngüsüne erişebilir.

Ayrıca, etkinlik içinde geri düğmesi davranışını yönetmek için getOnBackPressedCallback örneklerini kaydetmek üzere kullanılabilecek getOnBackPressedDispatcher API'sini de sağlar.


3. adım: Çalışma zamanı özellikli bir SDK oluşturun 5. adım: Test etme ve dağıtım için oluşturma