Key concepts | Set up your development environment | Build an RE SDK | Consume the RE SDK | 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:
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. } } }
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çinSandboxedSdkView
öğesine görünüm ekleyen veyaSandboxedSdkView
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.
- Reklamı göstermek için yalnızca
SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)
, Z sıralamasını açar ve bu şekilde, kullanıcı etkileşiminden elde edilenMotionEvents
öğesinin çalışma zamanı etkin SDK'ya mı yoksa çalışma zamanına duyarlı SDK'ya mı gönderileceğini etkiler.false
olarak ayarlanırsaMotionEvents
, çalışma zamanına duyarlı SDK'ya gönderilir. Aksi takdirde çalışma zamanı etkin SDK'ya gönderilirler. UI Presentation API'lerini kullanarak Z sıralaması hakkında daha fazla bilgi edinin.
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şturma5. adım: Dağıtım için test etme ve derleme