Bu kılavuz, Google Mobile Ads SDK'sını kullanarak uygulama açılış reklamlarını entegre eden yayıncılara yöneliktir.
Uygulama açılış reklamları, uygulama yükleme ekranlarından para kazanmak isteyen yayıncılara yönelik özel bir reklam biçimidir. Uygulama açılış reklamları dilediğiniz zaman kapatılabilir ve kullanıcılarınız uygulamanızı ön plana getirdiğinde gösterilecek şekilde tasarlanmıştır.
Uygulama açılış reklamları, kullanıcılara uygulamanızda olduklarını hatırlatmak için otomatik olarak küçük bir marka alanı gösterir. Aşağıda uygulama açılış reklamının nasıl göründüğüne dair bir örnek verilmiştir:
Ön koşullar
- Başlangıç kılavuzunu tamamlayın.
Her zaman test reklamlarıyla test yapın
Uygulamalarınızı oluşturup test ederken canlı üretim reklamları yerine test reklamları kullandığınızdan emin olun. Bunu yapmazsanız hesabınız askıya alınabilir.
Test reklamlarını yüklemenin en kolay yolu, uygulama açılış reklamları için özel test reklam birimi kimliğimizi kullanmaktır:
ca-app-pub-3940256099942544/9257395921
Her istek için test reklamları döndürecek şekilde özel olarak yapılandırılmıştır. Kodlama, test etme ve hata ayıklama sırasında kendi uygulamalarınızda kullanabilirsiniz. Uygulamanızı yayınlamadan önce bu kimliği kendi reklam birimi kimliğinizle değiştirmeniz yeterlidir.
Google Mobile Ads SDK'sının test reklamlarının işleyiş şekli hakkında daha fazla bilgi için Test reklamları etkinleştirme başlıklı makaleyi inceleyin.
Application sınıfını genişletme
Application
sınıfını genişleten yeni bir sınıf oluşturun ve uygulamanız başlatıldığında Google Mobile Ads SDK'sını ilk kullanıma hazırlamak için aşağıdaki kodu ekleyin.
Java
/** Application class that initializes, loads and show ads when activities change states. */
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
new Thread(
() -> {
// Initialize the Google Mobile Ads SDK on a background thread.
MobileAds.initialize(this, initializationStatus -> {});
})
.start();
}
}
Kotlin
/** Application class that initializes, loads and show ads when activities change states. */
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
val backgroundScope = CoroutineScope(Dispatchers.IO)
backgroundScope.launch {
// Initialize the Google Mobile Ads SDK on a background thread.
MobileAds.initialize(this@MyApplication) {}
}
}
}
Bu işlem, SDK'yı ilk kullanıma hazırlar ve daha sonra uygulama ön planda etkinleştirme etkinlikleri için kaydolduğunuz iskeleti sağlar.
Ardından, AndroidManifest.xml
dosyanıza aşağıdaki kodu ekleyin:
<!-- TODO: Update to reference your actual package name. -->
<application
android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>
Altyapı bileşeninizi uygulama
Reklamınız hızlı bir şekilde gösterilmelidir. Bu nedenle, reklamınızı göstermeniz gerekmeden önce yüklemeniz en iyisidir. Böylece, kullanıcınız uygulamanıza girer girmez yayınlanmaya hazır bir reklamınız olur.
Reklamı göstermeniz gerektiğinden önce reklam isteği göndermek için bir yardımcı program bileşeni AppOpenAdManager
uygulayın.
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/9257395921";
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 later.
}
/** 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/9257395921"
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 later.
}
/** Check if ad exists and can be shown. */
private fun isAdAvailable(): Boolean {
return appOpenAd != null
}
}
}
Bir yardımcı program sınıfınız olduğuna göre bunu MyApplication
sınıfınızda örneklendirebilirsiniz:
Java
public class MyApplication extends Application {
private AppOpenAdManager appOpenAdManager;
@Override
public void onCreate() {
super.onCreate();
new Thread(
() -> {
// Initialize the Google Mobile Ads SDK on a background thread.
MobileAds.initialize(this, initializationStatus -> {});
})
.start();
appOpenAdManager = new AppOpenAdManager(this);
}
}
Kotlin
class MyApplication : Application() {
private lateinit var appOpenAdManager: AppOpenAdManager
override fun onCreate() {
super.onCreate()
val backgroundScope = CoroutineScope(Dispatchers.IO)
backgroundScope.launch {
// Initialize the Google Mobile Ads SDK on a background thread.
MobileAds.initialize(this@MyApplication) {}
}
appOpenAdManager = AppOpenAdManager()
}
}
Reklam yükleme
Sonraki adım, loadAd()
yöntemini doldurmak ve reklam yükleme geri çağırma işlevlerini işlemek olacaktır.
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;
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;
}
});
}
// ...
}
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
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;
}
})
}
// ...
}
Reklamı gösterme ve tam ekran geri çağırma etkinliklerini işleme
Uygulama açılış reklamı için en yaygın uygulama yöntemi, uygulamanın başlatılmasına yakın bir zamanda uygulama açılış reklamı göstermeye çalışmak, reklam hazır değilse uygulama içeriğini başlatmak ve bir sonraki uygulama açılış fırsatı için başka bir reklamı önceden yüklemektir. Uygulama açılış reklamı uygulama örnekleri için Uygulama açılış reklamı kılavuzu başlıklı makaleyi inceleyin.
Aşağıdaki kodda, bir reklamın nasıl gösterileceği ve ardından nasıl yeniden yükleneceği gösterilmektedir:
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
reklamın gösterilmesi, gösterilmemesi veya kapatılması gibi etkinlikleri işler.
Reklam geçerlilik süresini göz önünde bulundurma
Geçerlilik süresi dolan bir reklamı göstermediğinizden emin olmak için AppOpenAdManager
içine reklam referansınızın yüklendiği tarihten bu yana ne kadar süre geçtiğini kontrol eden bir yöntem ekleyin. Ardından, reklamın hâlâ geçerli olup olmadığını kontrol etmek için bu yöntemi kullanın.
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;
// ...
/** 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;
// ...
/** Utility method to check if ad was loaded more than n hours ago. */
private fun wasLoadTimeLessThanNHoursAgo(numHours: Long): Boolean {
val dateDifference: Long = Date().time - loadTime
val numMilliSecondsPerHour: Long = 3600000
return dateDifference < numMilliSecondsPerHour * numHours
}
/** Check if ad exists and can be shown. */
private fun isAdAvailable(): Boolean {
return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4)
}
}
Mevcut etkinliği takip etme
Reklamı göstermek için bir Activity
bağlamına ihtiyacınız vardır. Kullanılan en güncel etkinliği takip etmek için Application.ActivityLifecycleCallbacks
'e kaydolup bu özelliği uygulayın.
Java
public class MyApplication extends Application implements ActivityLifecycleCallbacks {
private Activity currentActivity;
@Override
public void onCreate() {
super.onCreate();
this.registerActivityLifecycleCallbacks(this);
// ...
}
/** ActivityLifecycleCallback methods. */
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
@Override
public void onActivityStarted(Activity activity) {
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
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(this)
// ...
}
/** ActivityLifecycleCallback methods. */
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
override fun onActivityStarted(activity: Activity) {
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) {}
}
registerActivityLifecycleCallbacks
tüm Activity
etkinliklerini dinlemenizi sağlar. Etkinliklerin ne zaman başlatıldığını ve yok edildiğini dinleyerek mevcut Activity
referansını takip edebilirsiniz. Bu referansı daha sonra uygulama açma reklamınızı sunarken kullanırsınız.
Uygulamanın ön plana geçme etkinliklerini dinleme
Kitaplıkları gradle dosyanıza ekleme
Uygulamanın ön plana geçme etkinlikleri hakkında bildirim almak için bir DefaultLifecycleObserver
kaydetmeniz gerekir. Bağımlılığını uygulama düzeyindeki derleme dosyanıza ekleyin:
Kotlin
dependencies { implementation("com.google.android.gms:play-services-ads:23.6.0") implementation("androidx.lifecycle:lifecycle-process:2.8.3") }
Modern
dependencies { implementation 'com.google.android.gms:play-services-ads:23.6.0' implementation 'androidx.lifecycle:lifecycle-process:2.8.3' }
Yaşam döngüsü gözlemci arayüzünü uygulama
DefaultLifecycleObserver
arayüzünü uygulayarak ön planda gösterme etkinliklerini dinleyebilirsiniz.
Uygulama açılış reklamını göstermek için onStart
etkinliğini uygulayın.
Java
public class MyApplication extends Application
implements ActivityLifecycleCallbacks, LifecycleObserver {
// ...
@Override
public void onCreate() {
super.onCreate();
this.registerActivityLifecycleCallbacks(this);
new Thread(
() -> {
// Initialize the Google Mobile Ads SDK on a background thread.
MobileAds.initialize(this, initializationStatus -> {});
})
.start();
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)
val backgroundScope = CoroutineScope(Dispatchers.IO)
backgroundScope.launch {
// Initialize the Google Mobile Ads SDK on a background thread.
MobileAds.initialize(this@MyApplication) {}
}
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.
}
})
}
}
Sıfırdan başlatma ve yükleme ekranları
Şu ana kadarki dokümanlar, uygulama açılış reklamlarını yalnızca kullanıcılar uygulamanızı bellekte askıya alınmışken ön plana getirdiğinde gösterdiğinizi varsaymaktadır. "Sıfırdan başlatma", uygulamanız başlatılırken daha önce bellekte askıya alınmamışsa gerçekleşir.
Sıfırdan başlatmaya örnek olarak kullanıcının uygulamanızı ilk kez açması verilebilir. Sıfırdan başlatma işleminde, hemen gösterilmeye hazır olan önceden yüklenmiş bir uygulama açılış reklamınız olmaz. Reklam isteğinde bulunduğunuz zaman ile reklamın size geri gönderilmesi arasında geçen gecikme, kullanıcıların bağlam dışı bir reklamla karşılaşmadan önce uygulamanızı kısa süreliğine kullanabildiği bir durum oluşturabilir. Bu, kötü bir kullanıcı deneyimi olduğundan önlenmelidir.
Uygulama açılış reklamlarını baştan başlatma sırasında kullanmanın tercih edilen yolu, oyun veya uygulama öğelerinizi yüklemek için bir yükleme ekranı kullanmak ve reklamı yalnızca yükleme ekranından göstermektir. Uygulamanız yüklenmeyi tamamladıysa ve kullanıcıyı uygulamanızın ana içeriğine gönderdiyse reklamı göstermeyin.
En iyi uygulamalar
Uygulama açılış reklamları, uygulama ilk açıldığında ve uygulama geçişleri sırasında uygulamanızın yükleme ekranından para kazanmanıza yardımcı olur. Ancak kullanıcılarınızın uygulamanızı kullanmaktan keyif alması için en iyi uygulamaları göz önünde bulundurmanız önemlidir. En iyi yöntemler şunlardır:
- Kullanıcılarınız uygulamanızı birkaç defa kullandıktan sonra ilk uygulama açılış reklamınızı gösterin.
- Kullanıcılarınızın uygulamanızın yüklenmesini beklediği zamanlarda uygulama açılış reklamları gösterin.
- Uygulama açılış reklamının altında yükleme ekranınız varsa ve reklam kapatılmadan önce yükleme ekranınızın yüklenmesi tamamlanırsa yükleme ekranınızı
onAdDismissedFullScreenContent()
yönteminde kapatmayı deneyebilirsiniz.
GitHub'daki örnekler
Sonraki adımlar
Aşağıdaki konuları inceleyin: