Dieser Leitfaden richtet sich an Publisher, die App-Start-Anzeigen über das Google Mobile Ads Android SDK einbinden.
App-Start-Anzeigen sind ein spezielles Anzeigenformat für Publisher, die mit ihren App-Ladebildschirmen Einnahmen erzielen möchten. App-Start-Anzeigen können jederzeit geschlossen werden. Sie sind so konzipiert, dass sie eingeblendet werden, wenn Nutzer Ihre App in den Vordergrund stellen.
Bei App-Start-Anzeigen wird automatisch ein kleiner Brandingbereich eingeblendet, damit Nutzer wissen, dass sie sich in Ihrer App befinden. Hier ein Beispiel für eine App-Start-Anzeige:
Grundsätzlich sind dies die folgenden wichtigen Schritte:
- Erweitern Sie die Klasse
Application
, um das Google Mobile Ads SDK zu initialisieren. - Erstellen Sie eine Dienstprogrammklasse, die eine Anzeige lädt, bevor sie ausgeliefert werden muss.
- Laden Sie eine Anzeige.
ActivityLifecycleCallbacks.
anhören- Anzeige präsentieren und Callbacks verarbeiten
- Implementieren und registrieren Sie die
LifecycleObserver
-Schnittstelle, um eine Anzeige bei Ereignissen im Vordergrund zu schalten.
Voraussetzungen
- Google Mobile Ads SDK 19.4.0 oder höher.
- Folgen Sie der Einrichtungsanleitung im Startleitfaden.
Immer mit Testanzeigen testen
Achten Sie beim Erstellen und Testen Ihrer Apps darauf, Testanzeigen und keine aktiven Anzeigen zu verwenden. Andernfalls kann Ihr Konto gesperrt werden.
Testanzeigen lassen sich am einfachsten mit der entsprechenden Testanzeigenblock-ID für App-Start-Anzeigen laden:
ca-app-pub-3940256099942544/3419835294
Es wurde speziell so konfiguriert, dass bei jeder Anfrage Testanzeigen zurückgegeben werden. Sie können es in Ihren eigenen Apps verwenden, wenn Sie programmieren, testen und Fehler beheben möchten. Ersetzen Sie sie vor der Veröffentlichung Ihrer App einfach durch Ihre eigene Anzeigenblock-ID.
Weitere Informationen zur Funktionsweise der Testanzeigen des Mobile Ads SDK finden Sie unter Testanzeigen.
Anwendungsklasse erweitern
Erstellen Sie eine neue Klasse, mit der die Application
-Klasse erweitert wird, und fügen Sie den folgenden Code hinzu, um das Google Mobile Ads SDK zu initialisieren.
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) {} } }
Dadurch wird das SDK initialisiert und das Skelett bereitgestellt, in dem Sie sich später für App-Fronting-Ereignisse registrieren.
Fügen Sie als Nächstes den folgenden Code in die Datei AndroidManifest.xml
ein:
<application
android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>
Geben Sie dabei unbedingt den tatsächlichen Paketnamen an.
Klasse des Dienstprogramms implementieren
Die Anzeige sollte schnell ausgeliefert werden. Laden Sie sie daher am besten, bevor Sie sie präsentieren. So können Sie eine Anzeige sofort schalten, wenn der Nutzer Ihre App öffnet. Implementieren Sie eine Dienstprogrammklasse, um Anzeigenanfragen zu starten, bevor die Anzeige ausgeliefert werden muss.
Erstellen Sie innerhalb der Klasse MyApplication
eine neue Klasse mit dem Namen AppOpenAdManager
und füllen Sie sie so aus:
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 } } }
Nachdem Sie nun eine Dienstprogrammklasse haben, können Sie sie in der MyApplication
-Klasse instanziieren:
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() } }
Anzeige laden
Als Nächstes müssen Sie die Methode loadAd()
ausfüllen.
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; } }) } ... }
Für AppOpenAdLoadCallback
gibt es Methoden, die aufgerufen werden, wenn AppOpenAd
geladen ist.
Aktuelle Aktivität im Blick behalten
Zum Anzeigen der Anzeige benötigen Sie den Kontext Activity
. Damit Sie die von Ihrem Nutzer verwendete aktuelle Aktivität verfolgen können, implementieren Sie den Application.ActivityLifecycleCallbacks
in Ihrer Application
-Klasse.
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) {} }
Damit Sie die aktuelle Aktivität besser im Auge behalten, haben Sie einen Kontext für die Auslieferung der Anzeige. Sie müssen diese Schnittstelle jetzt mit der Methode registerActivityLifecycleCallbacks
registrieren.
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() } }
Mit registerActivityLifecycleCallbacks
können Sie alle Activity
-Ereignisse beobachten. Wenn Sie beobachten, wann Aktivitäten gestartet und gelöscht werden, können Sie einen Verweis auf den aktuellen Activity
erfassen, den Sie dann für die Präsentation der App-Start-Anzeige verwenden können.
Anzeige einblenden und Callback-Ereignisse im Vollbildmodus verarbeiten
Im folgenden Code sehen Sie, wann eine Anzeige ausgeliefert und anschließend aktualisiert wird.
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) } ... } }
Mit FullScreenContentCallback
werden Ereignisse verarbeitet, z. B. wenn die Anzeige präsentiert wird, nicht präsentiert wird oder geschlossen wird. Wenn ein Nutzer zu Ihrer App zurückkehrt, nachdem er sie verlassen hat, indem er auf eine App-Start-Anzeige klickt, wird dafür gesorgt, dass er keine andere App-Start-Anzeige sieht.
Ereignisse im Vordergrund der App beobachten
Bibliotheken zur Gradle-Datei hinzufügen
Damit Sie über Vordergrundereignisse von Apps benachrichtigt werden, müssen Sie ein LifecycleObserver
registrieren. Bearbeiten Sie zuerst die Datei build.gradle
auf Anwendungsebene, damit sie die LifecycleObserver
-Bibliotheken enthält:
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"
}
LebenszyklusObserver-Schnittstelle implementieren
Wenn Sie in der Application
-Klasse Vordergrundereignisse beobachten möchten, können Sie die Schnittstelle LifecycleObserver
implementieren.
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. } }) } }
Wenn Sie LifecycleObserver
registrieren, wird Ihre App bei App-Start- und Vordergrundereignissen benachrichtigt und kann die Anzeige zum entsprechenden Zeitpunkt ausliefern.
Ablauf der Anzeigen berücksichtigen
Damit keine abgelaufene Anzeige ausgeliefert wird, sollten Sie eine Methode in AppOpenAdManager
einfügen, mit der geprüft wird, wie lange es her ist, dass Ihre Anzeigenreferenz geladen wurde. Überprüfen Sie dann mit dieser Methode, ob die Anzeige noch gültig ist.
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) } }
Kaltstarts und Ladebildschirme
In der Dokumentation wird bisher davon ausgegangen, dass Sie App-Start-Anzeigen nur ausliefern, wenn Nutzer Ihre App im Arbeitsspeicher sperren. „Kaltstarts“ treten auf, wenn Ihre App gestartet, aber vorher nicht im Arbeitsspeicher gesperrt wurde.
Ein Beispiel für einen Kaltstart ist, wenn ein Nutzer Ihre App zum ersten Mal öffnet. Bei Kaltstarts wird keine zuvor geladene App-Start-Anzeige eingeblendet, die sofort zur Auslieferung bereit ist. Die Verzögerung zwischen dem Anfordern einer Anzeige und dem Erhalt einer Anzeige kann zu einer Situation führen, in der Nutzer Ihre App kurz verwenden können, bevor sie von einer Anzeige ohne Kontext überrascht werden. Das sollten Sie vermeiden, weil es sich negativ auf die Nutzererfahrung auswirkt.
App-Start-Anzeigen werden vor dem Kaltstart bevorzugt, wenn ein Ladebildschirm zum Laden der Spiele oder App-Assets verwendet und die Anzeige nur über den Ladebildschirm ausgeliefert werden soll. Die Anzeige sollte nicht ausgeliefert werden, wenn der Ladevorgang der App abgeschlossen und der Nutzer zum Hauptinhalt der App weitergeleitet wurde.
Best Practices
Mit App-Start-Anzeigen können Sie schon auf dem Ladebildschirm Ihrer App Einnahmen erzielen, wenn die App erstmals gestartet wird und während der App-Wechsel ausgeführt wird. Sie sollten aber die Best Practices im Hinterkopf behalten, damit Ihre Nutzer die App verwenden können:
- Sie können Ihre erste App-Start-Anzeige präsentieren, nachdem Nutzer Ihre App mehrmals verwendet haben.
- Präsentieren Sie App-Start-Anzeigen zu Zeiten, in denen Nutzer auf das Laden der App warten würden.
- Wenn unter der App-Start-Anzeige ein Ladebildschirm zu sehen ist, der geladen wird, bevor die Anzeige geschlossen wird, sollten Sie den Ladebildschirm in der Methode
onAdDismissedFullScreenContent()
schließen.