Ç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 çalışma zamanında etkinleştirilen (RE) SDK API'leriyle nasıl etkileşime geçebileceği açıklanmaktadır.

Bu kılavuzda, mevcut SDK modülünüzü (veya çalışma zamanından haberdar SDK'nızı) istemci olarak adlandırıyoruz.

Çalışma zamanı özellikli SDK'yı doğrudan uygulamanıza dahil etmek istiyorsanız istemci uygulama modülüdür.

Çalışma zamanında etkinleştirilen SDK'yı yükleme

Çalışma zamanı bilinçli 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ına duyarlı SDK'nın, çalışma zamanı etkin SDK'da belirtilen arayüze bağlanabileceğ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 istisna döndürür.

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

Araçlar, *Factory sınıfı oluşturmak için @PrivacySandboxService ile ek açıklama eklenmiş arayüzü kullanır.

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

Çalışma zamanına duyarlı SDK'nız, bu arayüzü kullanarak çalışma zamanı etkin SDK ile iletişim kurabilir ve önceki adımda beyan ettiğ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ı

Reklam göstermek için kullanıcı arayüzü kitaplığını kullanmak istiyorsanız androidx.privacysandbox.ui:ui-core ve androidx.privacysandbox.ui:ui-client kod yürütme ortamına duyarlı SDK'nızın build.gradle dosyasında bağımlılıklara eklediğinizden emin olun.

SandboxedSdkView kullanarak banner reklam yükleme

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

setAdapter(), kullanıcı arayüzü değişiklikleriyle ilgili reklam görüntüleme ve 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 şekilde 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ına duyarlı SDK'nız, kullanıcı arayüzü sunusu için oturum durumu değiştiğinde de bildirim alabilir. Bunun için:

  1. Farklı senaryoları işlemek için bir 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 örneklendirdiğiniz SandboxedSdkView nesnesine bir durum değişikliği dinleyicisi ekleyin. İşleyici, görünüme eklenir eklenmez geçerli durumla hemen çağrılır.

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

  • Çalışma zamanına duyarlı SDK, oturum henüz açılmadığında SandboxedSdkView yöntemlerini çağırırsa tüm etkiler, oturumun açılması bittikten sonra uygulanır.
    • SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop) gibi yöntemler
  • UnsupportedOperationException atandığı için SandboxedSdkView öğesine görünüm ekleyen veya SandboxedSdkView görünümündeki görünümü kaldıran yöntemler (addView(), removeView(), removeViewAt() vb.) desteklenmez.
    • Reklamı göstermek için yalnızca setAdapter() etiketini kullanın.
  • SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop), Z sıralamasını açar ve bu şekilde, kullanıcı etkileşiminden elde edilen MotionEvents öğesinin çalışma zamanı etkin SDK'ya mı yoksa çalışma zamanına duyarlı SDK'ya mı gönderileceğini etkiler.

Etkinlikleri başlatma

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

Bu başlatıcı daha sonra çalışma zamanında etkinleştirilen SDK'nıza iletilebilir. Böylece SDK, gerektiğinde etkinlikleri başlatabilir.

Etkinliğin başlatılıp başlatılmayacağını kontrol etmek için bir koşulu kullanabilirsiniz. Etkinliklere izin verilmesi için ön eklerin 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ında etkinleştirilen SDK'nızda SdkSandboxActivityHandlerCompat öğesini kaydedin ve SdkActivityLauncher.LaunchSdkActivity(IBinder)'a 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)
}

SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder) sınıfına iletilen ActivityHolder, LifecycleOwner sınıfını uygulayarak çalışma zamanında etkinleştirilen SDK'nıza etkinliğin yaşam döngüsüne erişim sağlar.

Ayrıca, etkinlikteki geri düğmesi davranışını işlemek için getOnBackPressedCallback örneklerini kaydetmek üzere kullanılabilen getOnBackPressedDispatcher API'yi de sağlar.


3. adım: Çalışma zamanında etkinleştirilen bir SDK oluşturma 5. adım: Dağıtım için test etme ve derleme