Apps Kit SDK logoApps Kit SDK
Документация · Интеграция с Android

5. Инициализация SDK и AdsManager

5.1 Класс Application

Создайте подкласс AppsKitSDKApplication и реализуйте пять его абстрактных методов:

kotlin
class YourApplication : AppsKitSDKApplication() {

    // Encrypted default-config JSON to fall back on before Remote Config is fetched.
    // Provided to you from the AKS portal for your app.
    override fun setAKSDefaultConfigs(): String = "<encrypted-config-json-from-aks-portal>"

    override fun isTestMode(): Boolean = BuildConfig.DEBUG

    override fun isDevMode(): Boolean = BuildConfig.DEBUG

    override fun setPlatform(): Platform = Platform.GOOGLE // or Platform.AMAZON

    override fun onConfigsReadyToUse(remoteConfig: FirebaseRemoteConfig) {
        // Called once Firebase Remote Config has been fetched/activated.
        // Optional hook if you need to read custom remote-config keys yourself.
    }
}

Метод onCreate() базового класса уже выполняет всю основную работу: вызывает AppsKitSDK.initialize/setPlatform/setTestMode/setDevMode, получает и сохраняет конфигурацию по умолчанию, запускает manageRemoteConfigs() и вызывает AppsKitSDK.initMMP() для подключения AppsFlyer/Adjust/Solar Engine. Самостоятельно вызывать эти методы не нужно.

5.2 Инициализация без наследования от AppsKitSDKApplication

Наследование от AppsKitSDKApplication необязательно — это обёртка для удобства. Если в вашем приложении уже есть собственный базовый класс Application, от которого нельзя отказаться, вы можете вызвать те же методы AppsKitSDK, которые обёртка вызывает внутри, напрямую из своего Application.onCreate():

kotlin
class YourApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        FirebaseApp.initializeApp(this)

        AppsKitSDK.initialize(PlatformContext(this), this)
        AppsKitSDK.setPlatform(Platform.GOOGLE) // or Platform.AMAZON
        AppsKitSDK.setTestMode(BuildConfig.DEBUG)
        AppsKitSDK.setDevMode(BuildConfig.DEBUG)
        AppsKitSDK.setTimeToFetchRemoteConfigInSeconds(3600) // optional, defaults to 3600

        AppsKitSDK.saveDefaultConfigJson("<encrypted-config-json-from-aks-portal>")
        AppsKitSDK.manageRemoteConfigs(object : OnRemoteConfigAvailable {
            override fun onRemoteConfigReadyToFetch(remoteConfig: FirebaseRemoteConfig) {
                // optional — your own hook into the fetched remote config
            }
        })

        AppsKitSDK.initMMP() // wires up AppsFlyer / Adjust / Solar Engine from remote-config keys

        // AppsKitSDKApplication does this for you via ActivityLifecycleCallbacks. Without it,
        // AppsKitSDK has no "current activity" — native-ad preloading and any code that calls
        // AppsKitSDK.getCurrentActivity() won't have a target to work with.
        registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
            override fun onActivityResumed(activity: Activity) {
                AppsKitSDK.setCurrentActivity(PlatformActivity(activity))
                Adjust.onResume() // keeps Adjust session tracking accurate
            }
            override fun onActivityPaused(activity: Activity) {
                Adjust.onPause()
            }
            override fun onActivityCreated(activity: Activity, bundle: Bundle?) {}
            override fun onActivityStarted(activity: Activity) {}
            override fun onActivityStopped(activity: Activity) {}
            override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {}
            override fun onActivityDestroyed(activity: Activity) {}
        })
    }
}

Без наследования от базового класса вы теряете обработку широковещательных уведомлений о состоянии интернет-соединения и соответствующих диалогов, а также встроенный сценарий показа рекламы App Open на уровне приложения (requestSplashAppOpenAd/showAppOpenAd, автоматически запускаемый из onStart). Это методы экземпляра самого AppsKitSDKApplication, недоступные через объект AppsKitSDK. Если вам всё же нужна реклама App Open при холодном запуске, самостоятельно вызовите AdsManager.loadAppOpen/AdsManager.showAppOpen (см. §6) в нужном месте собственного сценария запуска.

5.3 Activity

Наследуйтесь от AppsKitSDKBaseActivity (для экранов на базе AppCompatActivity) или AppsKitSDKBaseComponentActivity (для экранов на обычном ComponentActivity или только на Compose):

kotlin
class HomeActivity : AppsKitSDKBaseActivity() {

    override fun setScreenNameAndId(): Pair<Int, String> = Pair(1, "Home")

    override fun enableAppAutoUpdate(): Boolean = true

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState) // required — this drives ad-network init, preloading,
                                            // session/day tracking, and the auto SCREEN event
        setContent { /* your Compose UI */ }
    }
}

Наследование от этих базовых классов автоматически обеспечивает: инициализацию рекламных сетей и предзагрузку рекламы на первом экране, передачу событий жизненного цикла в IronSource через onResume/onPause, учёт сессий и количества дней, диалог состояния интернет-соединения, опциональные предложения обновить приложение внутри него, а также sendAKSEvent(...) для отправки событий, связанных с этим экраном (см. §7). (Передача вызовов onResume/onPause в Adjust выполняется на уровне Application — см. §5.2 — а не здесь.)

Диалог состояния интернет-соединения

Оба базовых класса Activity начинают отслеживать подключение в onResume() и по умолчанию при потере соединения показывают блокирующий диалог «Нет интернета», который автоматически закрывается после восстановления связи. Это поведение включено для каждого экрана, пока вы его не отключите:

kotlin
class HomeActivity : AppsKitSDKBaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        showInternetConnectivity(false) // opt this screen out of the automatic dialog
    }

    // Called on every connectivity change, dialog or not — hook your own UI here
    override fun onInternetConnectivityChange(isInternetAvailable: Boolean?) {
        // e.g. show/hide your own offline banner
    }

    // Optional — return an anchor view to get a "back online" Snackbar when the
    // dialog dismisses on reconnect. Returns null (no Snackbar) by default.
    override fun getSnackBarView(): View? = findViewById(R.id.rootLayout)
}

После вызова showInternetConnectivity(false) AKS по-прежнему вызывает onInternetConnectivityChange, но всегда передаёт true, независимо от фактического состояния подключения: после отключения этой функции реальное состояние соединения не отслеживается. Если для вашего интерфейса отсутствия сети важно точное состояние, используйте собственную проверку подключения.

Фиксация портретной ориентации

Чтобы зафиксировать портретную ориентацию экрана, вызовите restrictPortraitOnly() (метод с доступом protected, доступен в обоих базовых классах Activity):

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    restrictPortraitOnly()
}

Этот метод вызывает за вас setRequestedOrientation(SCREEN_ORIENTATION_PORTRAIT), кроме Android 8.0 (API 26), где вызов намеренно пропускается: в этой версии ОС setRequestedOrientation может приводить к аварийному завершению приложения для Activity с полупрозрачной или плавающей темой.

5.4 Согласие пользователя и инициализация рекламы

После получения согласия пользователя (например, через UMP/CMP от Google) сообщите об этом AKS, чтобы разрешить показ рекламы:

kotlin
AdsManager.initializeAds(userHasGivenConsent = true, isCCPAConsent = true)

5.5 Отключение рекламы через встроенные покупки (IAP)

Если в вашем приложении есть покупка «Отключить рекламу», подключите её через AKS вместо самостоятельной проверки перед рекламными вызовами: каждый вызов загрузки или показа уже проверяет этот флаг внутри:

kotlin
AppsKitSDK.setRemoveAdsStatus(true)   // call after a successful purchase/restore
AppsKitSDK.getRemoveAdsStatus()       // check current status