SmartTiming
Inteligentne wykrywanie najlepszych momentów na reklamę
📖 Przegląd
Moduł SmartTiming analizuje zachowanie użytkownika i sugeruje optymalne
momenty na pokazanie reklamy, minimalizując frustrację użytkowników.
✅ Korzyści: Lepsze UX, wyższy CTR, mniej negatywnych opinii
Szybki przykład
// Konfiguracja
ADict.SmartTiming.configure(
minSessionTimeMs = 30_000L,
minScreenViews = 3,
cooldownMs = 60_000L
)
// Sprawdzenie
if (ADict.SmartTiming.isGoodMoment()) {
showInterstitial()
}
⚙️ Konfiguracja
configure(...)
Skonfiguruj parametry wykrywania.
| Parametr | Typ | Domyślnie | Opis |
|---|---|---|---|
minSessionTimeMs |
Long | 30_000 | Min. czas sesji przed reklamą |
minScreenViews |
Int | 3 | Min. liczba ekranów |
cooldownMs |
Long | 60_000 | Cooldown między reklamami |
naturalBreakThresholdMs |
Long | 3_000 | Czas nieaktywności = przerwa |
avoidDuringInteraction |
Boolean | true | Unikaj podczas interakcji |
postInteractionDelayMs |
Long | 1_500 | Opóźnienie po interakcji |
minCompletedActions |
Int | 0 | Min. ukończonych akcji |
📊 Śledzenie
trackScreenView()
Śledź wyświetlenie ekranu (automatyczne jeśli autoTrackLifecycle=true).
trackInteraction()
Śledź interakcję użytkownika (automatyczne dla touch events).
trackCompletedAction(actionName?)
Śledź ukończoną akcję (level, artykuł, etc.).
markNaturalBreak()
Oznacz naturalną przerwę (koniec video, zamknięcie dialogu).
markAdShown()
Oznacz że reklama została pokazana.
Śledzenie w grze
// Po ukończeniu poziomu
fun onLevelComplete(level: Int) {
ADict.SmartTiming.trackCompletedAction("level_$level")
ADict.SmartTiming.markNaturalBreak()
// Teraz jest dobry moment!
if (ADict.SmartTiming.isGoodMoment()) {
showInterstitial()
}
}
// Po obejrzeniu cutsceny
fun onCutsceneEnded() {
ADict.SmartTiming.markNaturalBreak()
}
// Przy pokazaniu reklamy
fun showInterstitial() {
interstitialAd.show()
ADict.SmartTiming.markAdShown()
}
🎯 Ewaluacja
isGoodMoment(): Boolean
Sprawdź czy to dobry moment na reklamę.
evaluate(): State
Szczegółowa ewaluacja z przyczynami.
Ewaluacja stanu
val state = ADict.SmartTiming.evaluate()
println("Session: ${state.sessionDurationMs}ms")
println("Screens: ${state.screenViews}")
println("Since interaction: ${state.timeSinceLastInteraction}ms")
println("Since last ad: ${state.timeSinceLastAd}ms")
println("Natural break: ${state.isNaturalBreak}")
println("User active: ${state.isUserActive}")
println("Completed actions: ${state.completedActions}")
println("Good moment: ${state.isGoodMoment}")
println("Reasons: ${state.reasons}")
// Przykładowy output:
// Session: 45000ms
// Screens: 5
// Since interaction: 3500ms
// Since last ad: 120000ms
// Natural break: true
// User active: false
// Completed actions: 2
// Good moment: true
// Reasons: [natural_break]
🤖 Auto-show
showWhenReady(callback: () -> Unit)
Pokaż reklamę gdy będzie dobry moment.
showWhenReady(timeoutMs, callback, onTimeout?)
Z timeoutem.
cancelPending()
Anuluj oczekujące callbacki.
Auto-show z timeoutem
// Pokaż gdy będzie gotowe (bez timeoutu)
ADict.SmartTiming.showWhenReady {
showInterstitial()
}
// Z timeoutem 30 sekund
ADict.SmartTiming.showWhenReady(
timeoutMs = 30_000L,
callback = { showInterstitial() },
onTimeout = {
Log.d("SmartTiming", "Timeout - nie znaleziono dobrego momentu")
}
)
// Anuluj przy opuszczaniu ekranu
override fun onPause() {
super.onPause()
ADict.SmartTiming.cancelPending()
}
📡 Obserwacja (Flow)
Obserwacja stanu
lifecycleScope.launch {
ADict.SmartTiming.state.collect { state ->
if (state.isGoodMoment && shouldShowAd) {
showInterstitial()
shouldShowAd = false
}
}
}
💡 Przykłady praktyczne
Konfiguracja dla różnych typów aplikacji
// Gra casualowa - częstsze reklamy
ADict.SmartTiming.configure(
minSessionTimeMs = 20_000L,
minScreenViews = 2,
cooldownMs = 45_000L,
minCompletedActions = 1
)
// Aplikacja produktywności - rzadsze reklamy
ADict.SmartTiming.configure(
minSessionTimeMs = 60_000L,
minScreenViews = 5,
cooldownMs = 180_000L,
avoidDuringInteraction = true,
postInteractionDelayMs = 3000L
)
// Aplikacja newsowa - balanced
ADict.SmartTiming.configure(
minSessionTimeMs = 30_000L,
minScreenViews = 3,
cooldownMs = 90_000L,
naturalBreakThresholdMs = 5000L
)
📚 data class State
- sessionDurationMsLong
- screenViewsInt
- timeSinceLastInteractionLong
- timeSinceLastAdLong
- isNaturalBreakBoolean
- isUserActiveBoolean
- completedActionsInt
- isGoodMomentBoolean
- reasonsList<String>