Key concepts | Set up your development environment | Build an RE SDK | Consume the RE SDK | Testing, and building for distribution |
שימוש ב-SDK שתואם לזמן הריצה
בקטע הזה נסביר איך לקוחות יכולים לקיים אינטראקציה עם ממשקי ה-API של ה-SDK (RE) שהוצהרו כפעילים בסביבת זמן ריצה.
במדריך הזה, אנחנו מתייחסים למודול ה-SDK הקיים (או ל-SDK שמבוסס על זמן ריצה) בתור הלקוח.
אם רוצים להטמיע את ה-SDK התואם לזמן הריצה ישירות באפליקציה, מודול האפליקציה הוא הלקוח.
טעינת ערכת ה-SDK שתואמת לזמן ריצה
הדבר הראשון שצריך לעשות ב-SDK או באפליקציית הלקוח עם תמיכה בסביבת זמן הריצה הוא לטעון את ה-SDK שתומך בסביבת זמן הריצה.
המחלקה SdkSandboxManager
עוזרת לטעון ערכות SDK שתואמות לזמן ריצה, ומחזירה מחלקה IBinder
שה-SDK מבוסס-זמן הריצה יכול לקשר לממשק שהוצהר ב-SDK שמופעלת בו סביבת זמן ריצה.
צריך לוודא שטוענים כל ערכת SDK שתואמת לזמן ריצה רק פעם אחת, אחרת מנהל ה-SDK יחזיר תוצאות חריגות.
הכלים ליצירת ספריית shim יוצרים מחלקות עוזרים שממירים את ממשק IBinder
שמוחזר על ידי SdkSandboxManager
חזרה לממשק ה-API של ה-SDK שהוצהר.
הכלים משתמשים בממשק עם הערות @PrivacySandboxService
כדי ליצור מחלקה *Factory
.
המחלקה הזו מכילה פונקציית wrapTo*
סטטית שממירה אובייקט IBinder
למכונה של ממשק ה-SDK שמותאם לזמן ריצה.
ה-SDK המותאם לסביבת זמן הריצה יכול לתקשר עם ה-SDK המותאם לסביבת זמן הריצה באמצעות הממשק הזה, ולהפעיל את ממשקי ה-API של ה-SDK שהצהרתם עליהם בשלב הקודם.
// 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
}
שימוש בספריית ממשק המשתמש
אם אתם רוצים להשתמש בספריית ממשק המשתמש כדי להציג מודעות, עליכם לוודא שהוספתם את androidx.privacysandbox.ui:ui-core
ואת androidx.privacysandbox.ui:ui-client
ליחסי התלות ב-build.gradle של ה-SDK שמותאם לסביבת זמן הריצה.
טעינת מודעת באנר באמצעות SandboxedSdkView
androidx.privacysandbox.ui:ui-client
מציגה ViewGroup
חדש שנקרא SandboxedSdkView
, שמארח ממשק משתמש שנוצר על ידי ערכת SDK שתואמת לזמן ריצה.
setAdapter()
פותח סשן עם ערכת SDK שתואמת לזמן ריצה כדי לקבל את הצפייה במודעה והתראות על שינויים בממשק המשתמש. כשערכת ה-SDK פותחת את
הסשן, המודעה מוצגת.
אפשר לשלב את זה באופן הבא:
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)
}
}
ה-SDK עם תמיכה בסביבת זמן ריצה יכול לקבל התראה גם כשמצב הסשן משתנה להצגת ממשק המשתמש. לשם כך:
יוצרים מחלקה
SessionStateChangeListener()
כדי לטפל בתרחישים השונים: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. } } }
מוסיפים מאזין לשינויים במצב ל-
SandboxedSdkView
שיצרתם קודם. המאזין נקרא מיד עם המצב הנוכחי ברגע שהוא מצורף לתצוגה.
שימו לב לנקודות הבאות:
- אם ה-SDK עם התמיכה בסביבת זמן הריצה קורא לשיטות
SandboxedSdkView
כשהסשן עדיין לא הושלם, כל ההשפעות יחולו אחרי שהסשן יושלם.- שיטות כמו SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)
- לא ניתן להפעיל שיטות שמוסיפות או מסירות תצוגה מ-
SandboxedSdkView
(כמוaddView()
,removeView()
,removeViewAt()
וכו'), והפעלה כזו תגרום להשלכתUnsupportedOperationException
.- רק יש להשתמש ב-
setAdapter()
כדי להציג את המודעה.
- רק יש להשתמש ב-
SandboxedSdkView.orderProviderUiAboveClientUi(providerUiOnTop)
מפעיל או משבית את הסדר Z, שמשפיע על האופן שבוMotionEvents
מאינטראקציה של משתמש נשלח ל-SDK שתומך בזמן ריצה או ל-SDK שמודע לזמן ריצה.- אם המדיניות מוגדרת לערך
false
, ערכי ה-MotionEvents
יישלחו ל-SDK שתומך בסביבת זמן ריצה, אחרת הם יישלחו ל-SDK שתומך בסביבת זמן ריצה. מידע נוסף על סדר Z באמצעות ממשקי API להצגת ממשק משתמש
- אם המדיניות מוגדרת לערך
התחלת פעילויות
כדי להתחיל פעילויות שנמצאות בבעלות של ערכת SDK שתואמת לזמן ריצה, צריך להשתמש בתוסף createSdkActivityLauncher
כדי ליצור מרכז אפליקציות ב-SDK שתומך בסביבת זמן ריצה.
לאחר מכן ניתן להעביר את מרכז האפליקציות הזה ל-SDK שתואם לזמן ריצה, וכך להתחיל פעילויות לפי הצורך.
אפשר להשתמש בתנאי כדי לקבוע אם הפעילות תושק או לא.
הפרדיקט צריך להחזיר ערך true
כדי לאפשר פעילויות.
val launchSdkActivityPredicate = {
// Boolean which has to be true to launch the activities
}
val launcher = baseActivity.createSdkActivityLauncher(launchSdkActivityPredicate)
fullscreenService.showActivity(launcher)
ב-SDK שתומך בסביבת זמן ריצה, רושמים את SdkSandboxActivityHandlerCompat
ומספקים אותו ל-SdkActivityLauncher.LaunchSdkActivity(IBinder)
.
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
שהועבר אל SdkSandboxActivityHandlerCompat.onActivityCreated(ActivityHolder)
מטמיע את LifecycleOwner
, וכך ה-SDK התואם את זמן הריצה מקבל גישה למחזור החיים של הפעילות.
הוא גם מספק את ה-API של getOnBackPressedDispatcher
, שאפשר להשתמש בו כדי לרשום מכונות getOnBackPressedCallback
לטיפול בהתנהגות של לחצן החזרה לאחור בתוך הפעילות.
שלב 3: פיתוח SDK שתואם לזמן ריצהשלב 5: בדיקה ובנייה של הפצה