Panduan ini ditujukan bagi penayang yang mengintegrasikan iklan di layar pembuka aplikasi menggunakan Google Mobile Ads Android SDK.
Iklan di layar pembuka aplikasi adalah format iklan khusus yang ditujukan bagi penayang yang ingin memonetisasi layar pemuatan aplikasi mereka. Iklan di layar pembuka aplikasi dapat ditutup kapan pun, dan dirancang untuk ditampilkan saat pengguna menampilkan aplikasi ke latar depan.
Iklan di layar pembuka aplikasi otomatis menampilkan area branding kecil sehingga pengguna tahu bahwa mereka berada di aplikasi Anda. Berikut adalah contoh tampilan iklan di layar pembuka aplikasi:
Secara umum, ini adalah langkah-langkah penting:
- Perluas class
Application
untuk melakukan inisialisasi Google Mobile Ads SDK. - Buat class utilitas yang memuat iklan sebelum Anda perlu menampilkannya.
- Muat iklan.
- Dengarkan
ActivityLifecycleCallbacks.
- Menampilkan iklan dan menangani callback.
- Terapkan dan daftarkan antarmuka
LifecycleObserver
untuk menampilkan iklan selama peristiwa latar depan.
Prasyarat
- Google Mobile Ads SDK 19.4.0 atau yang lebih tinggi.
- Ikuti petunjuk penyiapan di Panduan Memulai.
Selalu uji dengan iklan percobaan
Saat membuat dan menguji aplikasi, pastikan Anda menggunakan iklan pengujian, bukan iklan produksi aktif. Jika Anda tidak melakukannya, akun Anda dapat ditangguhkan.
Cara termudah untuk memuat iklan pengujian adalah menggunakan ID unit iklan pengujian khusus kami untuk iklan di layar pembuka aplikasi:
ca-app-pub-3940256099942544/3419835294
Konfigurasi ini telah dikonfigurasi secara khusus untuk menampilkan iklan pengujian untuk setiap permintaan, dan Anda bebas untuk menggunakannya di aplikasi Anda sendiri saat melakukan coding, menguji, dan men-debug. Cukup pastikan Anda menggantinya dengan ID unit iklan Anda sendiri sebelum memublikasikan aplikasi.
Untuk informasi selengkapnya tentang cara kerja iklan pengujian SDK Iklan Seluler, lihat Iklan Pengujian.
Memperluas class Aplikasi
Buat class baru yang memperluas class Application
, dan tambahkan kode berikut untuk menginisialisasi Google Mobile Ads SDK.
Java
/** Application class that initializes, loads and show ads when activities change states. */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); MobileAds.initialize( this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) {} }); } }
Kotlin
/** Application class that initializes, loads and show ads when activities change states. */ class MyApplication : Application() { override fun onCreate() { super.onCreate() MobileAds.initialize(this) {} } }
Tindakan ini akan menginisialisasi SDK dan menyediakan kerangka yang nantinya akan Anda daftarkan untuk peristiwa latar depan aplikasi.
Berikutnya, tambahkan kode berikut ke AndroidManifest.xml
:
<application
android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>
Pastikan untuk mereferensikan nama paket sebenarnya.
Mengimplementasikan class utilitas
Iklan Anda harus ditampilkan dengan cepat, jadi sebaiknya muat iklan sebelum Anda perlu menampilkannya. Dengan demikian, iklan Anda akan segera siap setelah pengguna masuk ke aplikasi Anda. Terapkan kelas utilitas untuk membuat permintaan iklan sebelum Anda perlu menampilkan iklan.
Buat class baru bernama AppOpenAdManager
di dalam class MyApplication
dan
isi sebagai berikut:
Java
public class MyApplication extends Application { ... /** Inner class that loads and shows app open ads. */ private class AppOpenAdManager { private static final String LOG_TAG = "AppOpenAdManager"; private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/3419835294"; private AppOpenAd appOpenAd = null; private boolean isLoadingAd = false; private boolean isShowingAd = false; /** Constructor. */ public AppOpenAdManager() {} /** Request an ad. */ private void loadAd(Context context) { // We will implement this below. } /** Check if ad exists and can be shown. */ private boolean isAdAvailable() { return appOpenAd != null; } } }
Kotlin
private const val String LOG_TAG = "AppOpenAdManager" private const val String AD_UNIT_ID = "ca-app-pub-3940256099942544/3419835294" public class MyApplication extends Application { ... /** Inner class that loads and shows app open ads. */ private inner class AppOpenAdManager { private var appOpenAd: AppOpenAd? = null private var isLoadingAd = false var isShowingAd = false /** Request an ad. */ fun loadAd(context: Context) { // We will implement this below. } /** Check if ad exists and can be shown. */ private fun isAdAvailable(): Boolean { return appOpenAd != null } } }
Setelah memiliki class utilitas, Anda dapat membuat instance di class MyApplication
:
Java
public class MyApplication extends Application { private AppOpenAdManager appOpenAdManager; @Override public void onCreate() { super.onCreate(); MobileAds.initialize( this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) {} }); appOpenAdManager = new AppOpenAdManager(this); } }
Kotlin
class MyApplication : Application() { private lateinit var appOpenAdManager: AppOpenAdManager override fun onCreate() { super.onCreate() MobileAds.initialize(this) {} appOpenAdManager = AppOpenAdManager() } }
Memuat iklan
Langkah berikutnya adalah mengisi metode loadAd()
.
Java
private class AppOpenAdManager { ... /** Request an ad. */ public void loadAd(Context context) { // Do not load ad if there is an unused ad or one is already loading. if (isLoadingAd || isAdAvailable()) { return; } isLoadingAd = true; AdRequest request = new AdRequest.Builder().build(); AppOpenAd.load( context, AD_UNIT_ID, request, AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT, new AppOpenAdLoadCallback() { @Override public void onAdLoaded(AppOpenAd ad) { // Called when an app open ad has loaded. Log.d(LOG_TAG, "Ad was loaded."); appOpenAd = ad; isLoadingAd = false; } @Override public void onAdFailedToLoad(LoadAdError loadAdError) { // Called when an app open ad has failed to load. Log.d(LOG_TAG, loadAdError.getMessage()); isLoadingAd = false; } }); } ... }
Kotlin
private inner class AppOpenAdManager { ... /** Request an ad. */ fun loadAd(context: Context) { // Do not load ad if there is an unused ad or one is already loading. if (isLoadingAd || isAdAvailable()) { return } isLoadingAd = true val request = AdRequest.Builder().build() AppOpenAd.load( context, AD_UNIT_ID, request, AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT, object : AppOpenAdLoadCallback() { override fun onAdLoaded(ad: AppOpenAd) { // Called when an app open ad has loaded. Log.d(LOG_TAG, "Ad was loaded.") appOpenAd = ad isLoadingAd = false } override fun onAdFailedToLoad(loadAdError: LoadAdError) { // Called when an app open ad has failed to load. Log.d(LOG_TAG, loadAdError.message) isLoadingAd = false; } }) } ... }
AppOpenAdLoadCallback
memiliki metode yang akan dipanggil saat AppOpenAd
selesai dimuat.
Memantau aktivitas saat ini
Untuk menampilkan iklan, Anda memerlukan konteks Activity
. Untuk memantau
aktivitas terbaru yang digunakan oleh pengguna, terapkan
Application.ActivityLifecycleCallbacks
di class Application
Anda.
Java
public class MyApplication extends Application implements ActivityLifecycleCallbacks { private Activity currentActivity; ... /** ActivityLifecycleCallback methods. */ @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} @Override public void onActivityStarted(Activity activity) { // Updating the currentActivity only when an ad is not showing. if (!appOpenAdManager.isShowingAd) { currentActivity = activity; } } @Override public void onActivityResumed(Activity activity) {} @Override public void onActivityStopped(Activity activity) {} @Override public void onActivityPaused(Activity activity) {} @Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {} @Override public void onActivityDestroyed(Activity activity) {} }
Kotlin
class MyApplication : Application(), Application.ActivityLifecycleCallbacks { private var currentActivity: Activity? = null ... /** ActivityLifecycleCallback methods. */ override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} override fun onActivityStarted(activity: Activity) { // Updating the currentActivity only when an ad is not showing. if (!appOpenAdManager.isShowingAd) { currentActivity = activity } } override fun onActivityResumed(activity: Activity) {} override fun onActivityPaused(activity: Activity) {} override fun onActivityStopped(activity: Activity) {} override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} override fun onActivityDestroyed(activity: Activity) {} }
Dengan melacak aktivitas saat ini, Anda memiliki konteks yang akan digunakan untuk menampilkan iklan. Anda sekarang harus mendaftarkan antarmuka ini menggunakan
metode registerActivityLifecycleCallbacks
.
Java
public class MyApplication extends Application { ... @Override public void onCreate() { super.onCreate(); this.registerActivityLifecycleCallbacks(this); MobileAds.initialize( this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) {} }); appOpenAdManager = new AppOpenAdManager(); } }
Kotlin
class MyApplication : Application() { ... override fun onCreate() { super.onCreate() registerActivityLifecycleCallbacks(this) MobileAds.initialize(this) {} appOpenAdManager = AppOpenAdManager() } }
registerActivityLifecycleCallbacks
memungkinkan Anda memproses semua peristiwa Activity
. Dengan memproses kapan aktivitas
dimulai dan dihancurkan, Anda dapat melacak referensi ke
Activity
saat ini, yang kemudian akan Anda gunakan dalam menampilkan iklan di layar pembuka aplikasi.
Menampilkan iklan dan menangani peristiwa callback layar penuh
Kode berikut menunjukkan kapan harus menampilkan dan kemudian memuat ulang iklan.
Java
public class MyApplication extends Application { ... /** Interface definition for a callback to be invoked when an app open ad is complete. */ public interface OnShowAdCompleteListener { void onShowAdComplete(); } private class AppOpenAdManager { ... /** Shows the ad if one isn't already showing. */ public void showAdIfAvailable( @NonNull final Activity activity, @NonNull OnShowAdCompleteListener onShowAdCompleteListener){ // If the app open ad is already showing, do not show the ad again. if (isShowingAd) { Log.d(LOG_TAG, "The app open ad is already showing."); return; } // If the app open ad is not available yet, invoke the callback then load the ad. if (!isAdAvailable()) { Log.d(LOG_TAG, "The app open ad is not ready yet."); onShowAdCompleteListener.onShowAdComplete(); loadAd(activity); return; } appOpenAd.setFullScreenContentCallback( new FullScreenContentCallback { @Override public void onAdDismissedFullScreenContent() { // Called when fullscreen content is dismissed. // Set the reference to null so isAdAvailable() returns false. Log.d(LOG_TAG, "Ad dismissed fullscreen content."); appOpenAd = null; isShowingAd = false; onShowAdCompleteListener.onShowAdComplete(); loadAd(activity); } @Override public void onAdFailedToShowFullScreenContent(AdError adError) { // Called when fullscreen content failed to show. // Set the reference to null so isAdAvailable() returns false. Log.d(LOG_TAG, adError.getMessage()); appOpenAd = null; isShowingAd = false; onShowAdCompleteListener.onShowAdComplete(); loadAd(activity); } @Override public void onAdShowedFullScreenContent() { // Called when fullscreen content is shown. Log.d(LOG_TAG, "Ad showed fullscreen content."); } }); isShowingAd = true; appOpenAd.show(activity); } ... } }
Kotlin
class MyApplication : Application() { ... /** Interface definition for a callback to be invoked when an app open ad is complete. */ interface OnShowAdCompleteListener { fun onShowAdComplete() } private inner class AppOpenAdManager { ... /** Shows the ad if one isn't already showing. */ fun showAdIfAvailable( activity: Activity, onShowAdCompleteListener: OnShowAdCompleteListener) { // If the app open ad is already showing, do not show the ad again. if (isShowingAd) { Log.d(LOG_TAG, "The app open ad is already showing.") return } // If the app open ad is not available yet, invoke the callback then load the ad. if (!isAdAvailable()) { Log.d(LOG_TAG, "The app open ad is not ready yet.") onShowAdCompleteListener.onShowAdComplete() loadAd(activity) return } appOpenAd?.setFullScreenContentCallback( object : FullScreenContentCallback() { override fun onAdDismissedFullScreenContent() { // Called when full screen content is dismissed. // Set the reference to null so isAdAvailable() returns false. Log.d(LOG_TAG, "Ad dismissed fullscreen content.") appOpenAd = null isShowingAd = false onShowAdCompleteListener.onShowAdComplete() loadAd(activity) } override fun onAdFailedToShowFullScreenContent(adError: AdError) { // Called when fullscreen content failed to show. // Set the reference to null so isAdAvailable() returns false. Log.d(LOG_TAG, adError.message) appOpenAd = null isShowingAd = false onShowAdCompleteListener.onShowAdComplete() loadAd(activity) } override fun onAdShowedFullScreenContent() { // Called when fullscreen content is shown. Log.d(LOG_TAG, "Ad showed fullscreen content.") } }) isShowingAd = true appOpenAd?.show(activity) } ... } }
FullScreenContentCallback
menangani peristiwa seperti kapan iklan ditampilkan, gagal, atau saat ditutup. Jika pengguna kembali ke aplikasi Anda setelah
keluar dari aplikasi dengan mengklik iklan di layar pembuka aplikasi, hal ini memastikan bahwa mereka tidak
ditampilkan dengan iklan di layar pembuka aplikasi lain.
Memproses peristiwa latar depan aplikasi
Menambahkan library ke file gradle
Agar mendapatkan notifikasi peristiwa latar depan aplikasi, Anda harus mendaftarkan
LifecycleObserver
. Pertama, edit file build.gradle
tingkat aplikasi untuk
menyertakan library LifecycleObserver
:
apply plugin: 'com.android.application'
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.gms:play-services-ads:22.1.0'
def lifecycle_version = "2.3.1"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
}
Mengimplementasikan antarmuka LifecycleObserver
Anda dapat memproses peristiwa latar depan di class Application
dengan
mengimplementasikan antarmuka LifecycleObserver
.
Java
public class MyApplication extends Application implements ActivityLifecycleCallbacks, LifecycleObserver { { ... @Override public void onCreate() { super.onCreate(); this.registerActivityLifecycleCallbacks(this); MobileAds.initialize( this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) {} }); ProcessLifecycleOwner.get().getLifecycle().addObserver(this); appOpenAdManager = new AppOpenAdManager(); } /** LifecycleObserver method that shows the app open ad when the app moves to foreground. */ @OnLifecycleEvent(Event.ON_START) protected void onMoveToForeground() { // Show the ad (if available) when the app moves to foreground. appOpenAdManager.showAdIfAvailable(currentActivity); } /** Show the ad if one isn't already showing. */ private void showAdIfAvailable(@NonNull final Activity activity) { showAdIfAvailable( activity, new OnShowAdCompleteListener() { @Override public void onShowAdComplete() { // Empty because the user will go back to the activity that shows the ad. } }); } }
Kotlin
class MyApplication : Application(), Application.ActivityLifecycleCallbacks, LifecycleObserver { ... override fun onCreate() { super.onCreate() registerActivityLifecycleCallbacks(this) MobileAds.initialize(this) {} ProcessLifecycleOwner.get().lifecycle.addObserver(this) appOpenAdManager = AppOpenAdManager() } /** LifecycleObserver method that shows the app open ad when the app moves to foreground. */ @OnLifecycleEvent(Lifecycle.Event.ON_START) fun onMoveToForeground() { // Show the ad (if available) when the app moves to foreground. currentActivity?.let { appOpenAdManager.showAdIfAvailable(it) } } /** Show the ad if one isn't already showing. */ fun showAdIfAvailable(activity: Activity) { showAdIfAvailable( activity, object : OnShowAdCompleteListener { override fun onShowAdComplete() { // Empty because the user will go back to the activity that shows the ad. } }) } }
Dengan mendaftarkan LifecycleObserver
, aplikasi Anda akan diberi tahu tentang peristiwa peluncuran
dan latar depan aplikasi, serta dapat menampilkan iklan pada waktu yang tepat.
Pertimbangkan masa berlaku iklan
Untuk memastikan Anda tidak menampilkan iklan yang masa berlakunya sudah habis, tambahkan metode ke AppOpenAdManager
yang memeriksa sudah berapa lama sejak referensi iklan Anda dimuat. Kemudian, gunakan metode tersebut
untuk memeriksa apakah iklan masih valid.
Java
private class AppOpenAdManager { ... /** Keep track of the time an app open ad is loaded to ensure you don't show an expired ad. */ private long loadTime = 0; /** Request an ad. */ public void loadAd(Context context) { // Do not load ad if there is an unused ad or one is already loading. if (isLoadingAd || isAdAvailable()) { return; } isLoadingAd = true; AdRequest request = new AdRequest.Builder().build(); AppOpenAd.load( context, AD_UNIT_ID, request, AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT, new AppOpenAdLoadCallback() { @Override public void onAdLoaded(AppOpenAd ad) { // Called when an app open ad has loaded. Log.d(LOG_TAG, "Ad was loaded."); appOpenAd = ad; isLoadingAd = false; loadTime = (new Date()).getTime(); } @Override public void onAdFailedToLoad(LoadAdError loadAdError) { // Called when an app open ad has failed to load. Log.d(LOG_TAG, loadAdError.getMessage()); isLoadingAd = false; } }); } ... /** Utility method to check if ad was loaded more than n hours ago. */ private boolean wasLoadTimeLessThanNHoursAgo(long numHours) { long dateDifference = (new Date()).getTime() - this.loadTime; long numMilliSecondsPerHour = 3600000; return (dateDifference < (numMilliSecondsPerHour * numHours)); } /** Check if ad exists and can be shown. */ public boolean isAdAvailable() { return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4); } }
Kotlin
private inner class AppOpenAdManager { ... /** Keep track of the time an app open ad is loaded to ensure you don't show an expired ad. */ private var loadTime: Long = 0 /** Request an ad. */ fun loadAd(context: Context) { // Do not load ad if there is an unused ad or one is already loading. if (isLoadingAd || isAdAvailable()) { return } isLoadingAd = true val request = AdRequest.Builder().build() AppOpenAd.load( context, AD_UNIT_ID, request, AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT, object : AppOpenAdLoadCallback() { override fun onAdLoaded(ad: AppOpenAd) { // Called when an app open ad has loaded. Log.d(LOG_TAG, "Ad was loaded.") appOpenAd = ad isLoadingAd = false loadTime = Date().time } override fun onAdFailedToLoad(loadAdError: LoadAdError) { // Called when an app open ad has failed to load. Log.d(LOG_TAG, loadAdError.message) isLoadingAd = false; } }) } ... private fun wasLoadTimeLessThanNHoursAgo(numHours: Long): Boolean { val dateDifference: Long = Date().time - loadTime val numMilliSecondsPerHour: Long = 3600000 return dateDifference < numMilliSecondsPerHour * numHours } private fun isAdAvailable(): Boolean { return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4) } }
Cold start dan layar pemuatan
Sejauh ini, dokumentasi ini mengasumsikan bahwa Anda hanya menampilkan iklan di layar pembuka aplikasi saat pengguna latar depan aplikasi Anda saat aplikasi ditangguhkan di memori. "Cold start" terjadi saat aplikasi Anda diluncurkan, tetapi sebelumnya tidak ditangguhkan di memori.
Contoh cold start adalah saat pengguna membuka aplikasi Anda untuk pertama kalinya. Dengan cold start, Anda tidak akan memiliki iklan di layar pembuka aplikasi yang sebelumnya dimuat, yang siap langsung ditampilkan. Penundaan antara saat Anda meminta iklan dan menerima iklan kembali dapat menciptakan situasi ketika pengguna dapat menggunakan aplikasi Anda secara singkat sebelum dikejutkan dengan iklan di luar konteks. Hal ini harus dihindari karena merupakan pengalaman pengguna yang buruk.
Cara yang lebih disukai untuk menggunakan iklan di layar pembuka aplikasi saat cold start adalah dengan menggunakan layar pemuatan untuk memuat aset game atau aplikasi, dan hanya menampilkan iklan dari layar pemuatan. Jika aplikasi Anda telah selesai dimuat dan telah mengarahkan pengguna ke konten utama aplikasi, jangan tampilkan iklan.
Praktik terbaik
Iklan di layar pembuka aplikasi membantu Anda memonetisasi layar pemuatan aplikasi, saat aplikasi pertama kali diluncurkan dan selama peralihan aplikasi, tetapi penting untuk memperhatikan praktik terbaik agar pengguna senang menggunakan aplikasi Anda. Sebaiknya:
- Tampilkan iklan di layar pembuka aplikasi pertama Anda setelah pengguna menggunakan aplikasi Anda beberapa kali.
- Tampilkan iklan di layar pembuka aplikasi selama pengguna tidak menunggu aplikasi Anda dimuat.
- Jika Anda memiliki layar pemuatan di bawah iklan di layar pembuka aplikasi, dan layar pemuatan
Anda selesai dimuat sebelum iklan ditutup, sebaiknya tutup
layar pemuatan Anda di metode
onAdDismissedFullScreenContent()
.
Contoh di GitHub
Langkah berikutnya
Pelajari privasi pengguna lebih lanjut.