스플래시 광고(Splash Ad)는 앱 실행 시 스플래시 화면에 표시되는 광고입니다. 앱의 로고와 함께 광고가 표시되어 자연스러운 사용자 경험을 제공합니다.
앱 시작 시 자연스러운 광고 노출
앱 로고와 함께 브랜드 이미지 유지
360dp × 270dp 광고 영역, 288dp × 288dp 로고 영역
이미지 광고 지원
Android 12+ 시스템 스플래시 스크린 지원
개발 환경에서는 테스트 유닛 ID를 사용하세요: PUBLIC_TEST_UNIT_ID_SPLASH
광고 및 로고 크기
스플래시 광고는 정해진 영역을 사용합니다:
로고 영역 : 288dp × 288dp (화면 중앙)
광고 영역 : 360dp × 270dp (화면 하단)
광고는 화면 하단에 표시되며, 상단에는 앱 로고가 배치됩니다
구현 방법
스플래시 광고는 앱의 요구사항에 따라 두 가지 방법으로 구현할 수 있습니다:
AdropSplashAd 사용 - 시스템 스플래시 스크린과 통합 (Android 12+)
AdropSplashAdView 사용 - 커스텀 스플래시 화면 구성
방법 1: AdropSplashAd 사용 (시스템 스플래시 통합)
Android 12 (API 31) 이상에서 시스템 스플래시 스크린과 통합하는 방법입니다. AdropSplashAdActivity가 스플래시 화면을 자동으로 관리합니다.
1단계: strings.xml 설정
app/src/main/res/values/strings.xml 파일에 다음 설정을 추가합니다.
< resources >
<!-- 앱 이름 -->
< string name = "app_name" > My App </ string >
<!-- 스플래시 광고 유닛 ID -->
< string name = "adrop_splash_ad_unit_id" translatable = "false" > YOUR_SPLASH_UNIT_ID </ string >
<!-- 스플래시 종료 후 이동할 Activity -->
< string name = "adrop_splash_ad_next_activity" translatable = "false" > com.yourcompany.yourapp.MainActivity </ string >
</ resources >
테스트 시에는 YOUR_SPLASH_UNIT_ID 대신 PUBLIC_TEST_UNIT_ID_SPLASH를 사용하세요.
2단계: 스플래시 로고 이미지 추가
앱 로고를 res/drawable/ 폴더에 추가합니다.
app/src/main/res/drawable/splash_logo.png
권장 사이즈: 288dp × 288dp (@2x: 576px, @3x: 864px)
3단계: AndroidManifest.xml 설정
AdropSplashAdActivity를 launcher activity로 설정합니다.
< manifest xmlns:android = "http://schemas.android.com/apk/res/android" >
< application
android:name = ".MyApplication"
android:theme = "@style/Theme.App" >
<!-- 스플래시 광고 Activity -->
< activity
android:name = "io.adrop.ads.splash.AdropSplashAdActivity"
android:theme = "@style/Theme.App.Splash"
android:exported = "true" >
< intent-filter >
< action android:name = "android.intent.action.MAIN" />
< category android:name = "android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
<!-- 메인 Activity (스플래시 종료 후 이동) -->
< activity
android:name = ".MainActivity"
android:exported = "false" />
</ application >
</ manifest >
AdropSplashAdActivity의 android:exported="true" 설정이 필요합니다.
4단계: 스플래시 테마 설정
res/values/themes.xml 파일에 스플래시 테마를 추가합니다.
< resources >
<!-- 앱 기본 테마 -->
< style name = "Theme.App" parent = "Theme.Material3.DayNight.NoActionBar" >
<!-- 앱 테마 설정 -->
</ style >
<!-- 스플래시 테마 (Android 12+) -->
< style name = "Theme.App.Splash" parent = "Theme.SplashScreen" >
< item name = "windowSplashScreenBackground" > @color/white </ item >
< item name = "windowSplashScreenAnimatedIcon" > @drawable/splash_logo </ item >
< item name = "postSplashScreenTheme" > @style/Theme.App </ item >
</ style >
</ resources >
Android 12 미만 기기에서는 시스템 스플래시가 표시되지 않고 바로 AdropSplashAdActivity가 표시됩니다.
5단계: 레이아웃 커스터마이징 (선택 사항)
기본 레이아웃을 사용하지 않고 커스텀 레이아웃을 원할 경우, 앱의 res/layout/ 폴더에 activity_adrop_splash_ad.xml 파일을 생성합니다.
res/layout/activity_adrop_splash_ad.xml
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "#ffffff"
android:paddingHorizontal = "24dp"
android:fitsSystemWindows = "true" >
<!-- 앱 로고 (중앙) -->
< ImageView
android:src = "@drawable/splash_logo"
android:layout_width = "288dp"
android:layout_height = "288dp"
android:scaleType = "fitXY"
android:layout_centerInParent = "true" />
<!-- 광고 영역 (하단) - 필수 -->
< ImageView
android:id = "@+id/adrop_splash_ad_image"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_centerHorizontal = "true"
android:layout_alignParentBottom = "true" />
</ RelativeLayout >
android:id="@+id/adrop_splash_ad_image"를 가진 ImageView는 필수입니다. 이 뷰에 광고가 표시됩니다.
6단계: Application에서 SDK 초기화
import android.app.Application
import io.adrop.ads.Adrop
class MyApplication : Application () {
override fun onCreate () {
super . onCreate ()
// SDK 초기화
Adrop. initialize ( this , production = false )
}
}
7단계: AdropSplashAd 리스너 구현 (선택 사항)
스플래시 광고 이벤트를 수신하려면 Application 클래스에서 리스너를 설정합니다.
import android.app.Application
import io.adrop.ads.Adrop
import io.adrop.ads.splash.AdropSplashAd
import io.adrop.ads.splash.AdropSplashAdListener
import io.adrop.ads.model.AdropErrorCode
class MyApplication : Application () {
private lateinit var splashAd: AdropSplashAd
override fun onCreate () {
super . onCreate ()
// SDK 초기화
Adrop. initialize ( this , production = false )
// 스플래시 광고 설정
splashAd = AdropSplashAd ( this ) { splashAd ->
// shouldSkip: 스플래시 광고를 건너뛸지 결정
// true 반환 시 광고를 표시하지 않고 바로 메인 화면으로 이동
checkShouldSkipSplash ()
}
splashAd.splashAdListener = object : AdropSplashAdListener {
override fun onAdReceived (ad: AdropSplashAd ) {
println ( "스플래시 광고 수신 성공" )
}
override fun onAdFailedToReceive (ad: AdropSplashAd , errorCode: AdropErrorCode ) {
println ( "스플래시 광고 수신 실패: $errorCode " )
}
override fun onAdImpression (ad: AdropSplashAd ) {
println ( "스플래시 광고 노출" )
}
override fun onAdClose (ad: AdropSplashAd , impressed: Boolean ) {
println ( "스플래시 광고 종료 - 노출됨: $impressed " )
}
}
}
private fun checkShouldSkipSplash (): Boolean {
// 예: 딥링크로 진입하거나 특정 조건에서 스플래시 건너뛰기
// 푸시 알림으로 앱이 실행된 경우 등
return false
}
}
AdropSplashAd 프로퍼티
프로퍼티 타입 설명 unitIdString광고 유닛 ID (읽기 전용) creativeIdString광고 크리에이티브 ID (읽기 전용) isClosedBoolean스플래시 광고 종료 여부 (읽기 전용)
AdropSplashAd 메서드
메서드 설명 close()스플래시 광고를 즉시 종료하고 다음 화면으로 이동
shouldSkip 콜백
AdropSplashAd 생성자의 shouldSkip 콜백을 사용하여 특정 조건에서 스플래시 광고를 건너뛸 수 있습니다.
val splashAd = AdropSplashAd (application) { splashAd ->
// 푸시 알림으로 앱이 실행된 경우 스플래시 건너뛰기
val isPushNotification = intent?.extras?. containsKey ( "push_notification" ) == true
// 딥링크로 진입한 경우 스플래시 건너뛰기
val hasDeepLink = intent?. data != null
isPushNotification || hasDeepLink
}
shouldSkip이 true를 반환하면 광고를 로드하지 않고 즉시 다음 화면으로 이동합니다.
스플래시 표시 시간 설정 (선택 사항)
기본 표시 시간(2초)을 변경하려면 res/values/integers.xml 파일을 생성하고 설정합니다.
< resources >
<!-- 광고 요청 타임아웃 (밀리초, 500~3000) -->
< integer name = "adrop_splash_ad_request_timeout" > 1000 </ integer >
<!-- 광고 표시 시간 (밀리초, 500~3000) -->
< integer name = "adrop_splash_ad_max_timeout" > 2000 </ integer >
</ resources >
설정 가능한 범위는 500ms ~ 3000ms입니다. 범위를 벗어난 값은 자동으로 보정됩니다.
푸시 알림 딥링크 시 스플래시 건너뛰기 (선택 사항)
푸시 알림을 통해 앱이 실행될 때 딥링크가 있으면 스플래시 광고를 건너뛰도록 설정할 수 있습니다.
< resources >
<!-- 푸시 알림 딥링크 시 스플래시 건너뛰기 -->
< bool name = "adrop_splash_ad_skip_push_notification_clicked" > true </ bool >
</ resources >
방법 2: AdropSplashAdView 사용 (커스텀 스플래시)
커스텀 스플래시 화면을 직접 구성하고 싶을 때 사용합니다. 자체 스플래시 Activity를 만들고 AdropSplashAdView를 배치합니다.
1단계: 레이아웃 작성
<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "#ffffff"
android:padding = "24dp" >
<!-- 앱 로고 -->
< ImageView
android:id = "@+id/logo"
android:layout_width = "288dp"
android:layout_height = "288dp"
android:layout_centerInParent = "true"
android:src = "@drawable/splash_logo"
android:scaleType = "fitXY" />
<!-- 스플래시 광고 뷰 -->
< io.adrop.ads.splash.AdropSplashAdView
android:id = "@+id/splash_ad_view"
android:layout_width = "match_parent"
android:layout_height = "270dp"
android:layout_alignParentBottom = "true" />
</ RelativeLayout >
2단계: SplashActivity 구현
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import io.adrop.ads.splash.AdropSplashAdView
import io.adrop.ads.splash.AdropSplashAdViewListener
import io.adrop.ads.model.AdropErrorCode
class SplashActivity : AppCompatActivity () {
private lateinit var splashAdView: AdropSplashAdView
override fun onCreate (savedInstanceState: Bundle ?) {
super . onCreate (savedInstanceState)
setContentView (R.layout.activity_splash)
// 스플래시 광고 뷰 초기화
splashAdView = AdropSplashAdView (
context = this ,
unitId = "YOUR_SPLASH_UNIT_ID" ,
adRequestTimeout = 1000L // 광고 요청 타임아웃 (밀리초)
)
// 리스너 설정
splashAdView.listener = object : AdropSplashAdViewListener {
override fun onAdReceived (ad: AdropSplashAdView ) {
println ( "스플래시 광고 수신 성공" )
}
override fun onAdFailedToReceive (ad: AdropSplashAdView , errorCode: AdropErrorCode ) {
println ( "스플래시 광고 수신 실패: $errorCode " )
}
override fun onAdImpression (ad: AdropSplashAdView ) {
println ( "스플래시 광고 노출" )
}
override fun onAdClose (ad: AdropSplashAdView , impressed: Boolean ) {
println ( "스플래시 광고 종료 - 노출됨: $impressed " )
goToMainActivity ()
}
}
// 광고 로드 및 표시
findViewById < ViewGroup >(android.R.id.content). addView (splashAdView)
splashAdView. load ()
}
private fun goToMainActivity () {
startActivity ( Intent ( this , MainActivity:: class .java))
finish ()
}
}
3단계: AndroidManifest.xml 설정
< manifest xmlns:android = "http://schemas.android.com/apk/res/android" >
< application >
<!-- 커스텀 스플래시 Activity -->
< activity
android:name = ".SplashActivity"
android:theme = "@style/Theme.App.Splash"
android:exported = "true" >
< intent-filter >
< action android:name = "android.intent.action.MAIN" />
< category android:name = "android.intent.category.LAUNCHER" />
</ intent-filter >
</ activity >
<!-- 메인 Activity -->
< activity
android:name = ".MainActivity"
android:exported = "false" />
</ application >
</ manifest >
AdropSplashAdView 프로퍼티
프로퍼티 타입 설명 unitIdString광고 유닛 ID (읽기 전용) creativeIdString광고 크리에이티브 ID (읽기 전용) isClosedBoolean스플래시 광고 종료 여부 (읽기 전용) txIdString거래 ID (읽기 전용) campaignIdString캠페인 ID (읽기 전용)
AdropSplashAdView 메서드
리스너
AdropSplashAdListener
AdropSplashAd를 사용할 때의 리스너입니다.
메서드 필수 설명 onAdReceived(ad)선택 광고 수신 성공 시 호출 onAdFailedToReceive(ad, errorCode)선택 광고 수신 실패 시 호출 onAdImpression(ad)선택 광고 노출이 기록되었을 때 호출 onAdClose(ad, impressed)선택 스플래시 광고 종료 시 호출
AdropSplashAdViewListener
AdropSplashAdView를 사용할 때의 리스너입니다.
메서드 필수 설명 onAdReceived(ad)선택 광고 수신 성공 시 호출 onAdFailedToReceive(ad, errorCode)선택 광고 수신 실패 시 호출 onAdImpression(ad)선택 광고 노출이 기록되었을 때 호출 onAdClose(ad, impressed)필수 스플래시 광고 종료 시 호출. 메인 화면 전환 처리 필요
AdropSplashAdView를 사용할 때는 onAdClose 메서드를 반드시 구현하여 메인 화면으로 전환 처리를 해야 합니다.
impressed 파라미터
onAdClose(ad, impressed) 메서드의 impressed 파라미터는 광고가 실제로 노출되었는지 여부를 나타냅니다.
override fun onAdClose (ad: AdropSplashAdView , impressed: Boolean ) {
if (impressed) {
println ( "광고가 사용자에게 노출되었습니다" )
// 광고 노출 후 처리 로직
} else {
println ( "광고가 노출되지 않았습니다 (로드 실패 또는 스킵)" )
// 광고 미노출 처리 로직
}
// 메인 화면으로 전환
goToMainActivity ()
}
impressed가 false인 경우
광고 로드 실패
네트워크 오류
사용자가 광고를 보기 전에 스킵
광고 인벤토리 부족
베스트 프랙티스
1. 적절한 타이머 설정
스플래시 광고는 너무 짧거나 길지 않게 표시해야 합니다.
<!-- 권장 설정 -->
< integer name = "adrop_splash_ad_request_timeout" > 1000 </ integer > <!-- 1초 -->
< integer name = "adrop_splash_ad_max_timeout" > 2000 </ integer > <!-- 2초 -->
2. 로고 이미지 최적화
앱 로고는 적절한 크기로 준비하여 로딩 시간을 최소화하세요.
drawable-mdpi/splash_logo.png (192px × 192px)
drawable-hdpi/splash_logo.png (288px × 288px)
drawable-xhdpi/splash_logo.png (384px × 384px)
drawable-xxhdpi/splash_logo.png (576px × 576px)
drawable-xxxhdpi/splash_logo.png (768px × 768px)
3. 실패 처리
광고 로드 실패 시에도 앱이 정상적으로 시작되도록 처리하세요.
override fun onAdFailedToReceive (ad: AdropSplashAdView , errorCode: AdropErrorCode ) {
println ( "광고 로드 실패: $errorCode " )
// 실패해도 메인 화면으로 전환
goToMainActivity ()
}
4. 테스트 환경 구분
개발과 배포 환경을 구분하여 테스트하세요.
val splashUnitId = if (BuildConfig.DEBUG) {
"PUBLIC_TEST_UNIT_ID_SPLASH"
} else {
"YOUR_PRODUCTION_SPLASH_UNIT_ID"
}
// SDK 초기화
Adrop. initialize (application, production = ! BuildConfig.DEBUG)
5. 메모리 누수 방지
Activity 종료 시 리스너를 정리하세요.
override fun onDestroy () {
splashAdView.listener = null
super . onDestroy ()
}
테스트
테스트 유닛 ID
개발 중에는 테스트 유닛 ID를 사용하세요.
// 테스트 유닛 ID
val testUnitId = "PUBLIC_TEST_UNIT_ID_SPLASH"
실제 배포 시에는 반드시 애드컨트롤 콘솔에서 생성한 실제 유닛 ID를 사용하세요. 테스트 유닛 ID로 배포하면 광고 수익이 발생하지 않습니다.
디버깅
광고 이벤트를 로그로 확인하세요.
splashAdView.listener = object : AdropSplashAdViewListener {
override fun onAdReceived (ad: AdropSplashAdView ) {
Log. d ( "AdropSplash" , "광고 수신 성공" )
Log. d ( "AdropSplash" , " - unitId: ${ ad.unitId } " )
Log. d ( "AdropSplash" , " - creativeId: ${ ad.creativeId } " )
}
override fun onAdFailedToReceive (ad: AdropSplashAdView , errorCode: AdropErrorCode ) {
Log. e ( "AdropSplash" , "광고 수신 실패: $errorCode " )
Log. e ( "AdropSplash" , " - 네트워크 상태 확인" )
Log. e ( "AdropSplash" , " - 유닛 ID 확인: ${ ad.unitId } " )
}
override fun onAdImpression (ad: AdropSplashAdView ) {
Log. d ( "AdropSplash" , "광고 노출" )
Log. d ( "AdropSplash" , " - txId: ${ ad.txId } " )
Log. d ( "AdropSplash" , " - campaignId: ${ ad.campaignId } " )
}
override fun onAdClose (ad: AdropSplashAdView , impressed: Boolean ) {
Log. d ( "AdropSplash" , "광고 종료" )
Log. d ( "AdropSplash" , " - impressed: $impressed " )
Log. d ( "AdropSplash" , " - isClosed: ${ ad.isClosed } " )
}
}
문제 해결
AndroidManifest.xml에서 AdropSplashAdActivity 또는 커스텀 SplashActivity가 LAUNCHER로 설정되었는지 확인
android:exported="true" 설정 확인
SDK 초기화가 완료되었는지 확인 (Application 클래스)
adrop_service.json 파일이 assets 폴더에 있는지 확인
네트워크 연결 상태 확인
유닛 ID가 올바른지 확인 (strings.xml 또는 코드)
테스트 환경에서는 production = false 설정 확인
onAdFailedToReceive 에러 코드 확인
adrop_service.json 파일 내용이 올바른지 확인
adrop_splash_ad_next_activity 설정이 올바른지 확인 (전체 패키지 경로)
AdropSplashAdView 사용 시 onAdClose 구현 확인
Activity의 full qualified name 확인 (예: com.myapp.MainActivity)
파일명이 정확히 activity_adrop_splash_ad.xml인지 확인
android:id="@+id/adrop_splash_ad_image" ID를 가진 ImageView가 있는지 확인
앱을 클린 빌드 후 재실행 (Build > Clean Project > Rebuild Project)
Android 12 미만에서 시스템 스플래시가 보이지 않음
이는 정상입니다. Android 12 미만 기기에서는 시스템 스플래시 스크린이 지원되지 않으며, 바로 AdropSplashAdActivity가 표시됩니다.
다음 단계