Dieser Leitfaden richtet sich an Publisher, die App-Start-Anzeigen mit dem Google Mobile Ads Android SDK integrieren.
App-Start-Anzeigen sind ein spezielles Anzeigenformat für Publisher, die ihre App-Ladebildschirme monetarisieren möchten. App-Start-Anzeigen können jederzeit geschlossen werden. Sie sind so konzipiert, dass sie ausgeliefert werden, wenn Nutzer Ihre App im Vordergrund ausführen.
Bei App-Start-Anzeigen wird automatisch ein kleiner Markenbereich eingeblendet, damit Nutzer wissen, dass sie sich in Ihrer App befinden. Hier ein Beispiel für eine App-Start-Anzeige:
Das sind die wichtigsten Schritte:
- Erweitern Sie die
Application
-Klasse, um das Google Mobile Ads SDK zu initialisieren. - Erstellen Sie eine Dienstprogrammklasse, die eine Anzeige lädt, bevor Sie sie anzeigen müssen.
- Laden Sie eine Anzeige.
- Erfasst
ActivityLifecycleCallbacks.
- Anzeige einblenden und Callbacks verarbeiten
- Implementieren und registrieren Sie die
LifecycleObserver
-Oberfläche, damit bei Ereignissen im Vordergrund eine Anzeige ausgeliefert wird.
Voraussetzungen
- Google Mobile Ads SDK 19.4.0 oder höher.
- Folgen Sie der Einrichtungsanleitung im Startleitfaden.
Immer mit Testanzeigen testen
Verwenden Sie beim Entwickeln und Testen Ihrer Apps Testanzeigen und keine Produktionsanzeigen. Andernfalls kann Ihr Konto gesperrt werden.
Am einfachsten lassen sich Testanzeigen mit unserer dedizierten Test-Anzeigenblock-ID für App-Start-Anzeigen laden:
/21775744923/example/app-open
Sie wurde speziell so konfiguriert, dass bei jeder Anfrage Testanzeigen zurückgegeben werden. Sie können die Funktion beim Programmieren, Testen und Debuggen in Ihren eigenen Apps verwenden. Ersetzen Sie sie einfach vor der Veröffentlichung Ihrer App durch Ihre Anzeigenblock-ID.
Weitere Informationen zur Funktionsweise von Testanzeigen des Mobile Ads SDK findest du unter Testanzeigen.
Anwendungsklasse erweitern
Erstellen Sie eine neue Klasse zur Erweiterung der Klasse Application
und fügen Sie den folgenden Code ein, 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();
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) {}
}
}
}
Dadurch wird das SDK initialisiert und das Grundgerüst für die spätere Registrierung für App-Vordergrundereignisse wird bereitgestellt.
Fügen Sie als Nächstes den folgenden Code in Ihr AndroidManifest.xml
ein:
<application
android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>
Achten Sie darauf, den tatsächlichen Paketnamen anzugeben.
Dienstprogrammklasse implementieren
Ihre Anzeige sollte schnell geschaltet werden. Daher ist es ratsam, sie zu laden, bevor Sie sie schalten müssen. Auf diese Weise haben Sie eine Anzeige, die ausgeliefert werden kann, sobald der Nutzer Ihre App verwendet. Implementieren Sie eine Dienstprogrammklasse, damit Anzeigenanfragen rechtzeitig gestellt werden, wenn 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 = "/21775744923/example/app-open";
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 = "/21775744923/example/app-open"
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 Ihrer MyApplication
-Klasse instanziieren:
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()
}
}
Anzeige laden
Im nächsten Schritt füllen Sie die Methode loadAd()
aus.
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
enthält Methoden, die aufgerufen werden, wenn der AppOpenAd
-Vorgang abgeschlossen ist.
Aktuelle Aktivitäten im Blick behalten
Damit die Anzeige ausgeliefert werden kann, ist ein Activity
-Kontext erforderlich. Implementieren Sie Application.ActivityLifecycleCallbacks
in Ihrer Application
-Klasse, um den Überblick über die aktuelle Aktivität des Nutzers zu behalten.
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) {}
}
Indem Sie die aktuelle Aktivität verfolgen, haben Sie einen Kontext, den Sie zum Einblenden der Anzeige verwenden können. Registrieren Sie diese Schnittstelle jetzt mit der Methode registerActivityLifecycleCallbacks
.
Java
public class MyApplication extends Application {
...
@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();
appOpenAdManager = new AppOpenAdManager();
}
}
Kotlin
class MyApplication : Application() {
...
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) {}
}
appOpenAdManager = AppOpenAdManager()
}
}
Mit registerActivityLifecycleCallbacks
können Sie auf alle Activity
-Ereignisse warten. Wenn Sie darauf warten, dass Aktivitäten gestartet und gelöscht werden, lässt sich ein Verweis auf das aktuelle Activity
erfassen, das Sie dann zum Präsentieren Ihrer App-Start-Anzeige verwenden.
Anzeige einblenden und Callback-Ereignisse im Vollbildmodus verarbeiten
Der folgende Code zeigt, wann eine Anzeige ausgeliefert und anschließend neu geladen werden soll.
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 eingeblendet wird, nicht eingeblendet werden kann oder geschlossen wird. Wenn ein Nutzer durch Klicken auf eine App-Start-Anzeige zu Ihrer App zurückkehrt, nachdem er sie verlassen hat, wird keine weitere App-Start-Anzeige präsentiert.
Auf App-Vordergrundereignisse warten
Bibliotheken der Gradle-Datei hinzufügen
Um über Ereignisse im Vordergrund von Apps informiert zu werden, musst du eine LifecycleObserver
registrieren. Bearbeiten Sie zuerst die Datei build.gradle
auf Anwendungsebene, sodass 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:23.2.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"
}
LifecycleObserver-Oberfläche implementieren
Sie können in Ihrer Application
-Klasse auf Ereignisse im Vordergrund warten, indem Sie die LifecycleObserver
-Schnittstelle implementieren.
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.
}
})
}
}
Wenn Sie LifecycleObserver
registrieren, wird Ihre App über App-Start- und Vordergrundereignisse informiert und kann die Anzeige zu den entsprechenden Zeiten ausliefern.
Ablauf von Anzeigen berücksichtigen
Damit keine abgelaufene Anzeige ausgeliefert wird, fügen Sie dem AppOpenAdManager
eine Methode hinzu, mit der geprüft wird, wie lange es her ist, dass die Anzeigenreferenz geladen wurde. Prü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
Bisher wird in der Dokumentation davon ausgegangen, dass App-Start-Anzeigen nur ausgeliefert werden, wenn Nutzer Ihre App in den Vordergrund stellen, wenn sie im Speicher gesperrt ist. „Kaltstarts“ treten auf, wenn deine App gestartet, aber zuvor nicht im Arbeitsspeicher ausgesetzt wurde.
Ein Beispiel für einen Kaltstart ist, wenn ein Nutzer Ihre App zum ersten Mal öffnet. Bei Kaltstarts gibt es keine bereits geladene App-Start-Anzeige, die sofort ausgeliefert werden kann. Die Verzögerung zwischen der Anzeigenanfrage und der erneuten Auslieferung der Anzeige kann dazu führen, dass Nutzer Ihre App kurz verwenden können, bevor sie von einer Anzeige außerhalb des Kontexts überrascht werden. Dies sollte vermieden werden, weil es eine negative User Experience darstellt.
App-Start-Anzeigen werden bei Kaltstarts vorzugsweise eingesetzt, wenn ein Ladebildschirm zum Laden der Spiel- oder App-Assets verwendet wird und die Anzeige nur auf dem Ladebildschirm eingeblendet wird. Wenn der Ladevorgang Ihrer App abgeschlossen ist und der Nutzer zum Hauptinhalt der App weitergeleitet wurde, sollte die Anzeige nicht ausgeliefert werden.
Best Practices
Mit App-Start-Anzeigen können Sie den Ladebildschirm Ihrer App beim ersten Start und beim Wechsel der App monetarisieren. Best Practices sollten Sie aber beachten, damit Ihre App für Nutzer Spaß macht. Wie sollten Sie vorgehen?
- Präsentieren Sie Ihre erste App-Start-Anzeige, nachdem Nutzer Ihre App einige Male 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 vorhanden ist und dieser vollständig geladen ist, bevor die Anzeige geschlossen wird, sollten Sie den Ladebildschirm mit der
onAdDismissedFullScreenContent()
-Methode schließen.
Beispiele auf GitHub
Nächste Schritte
Erkunden Sie die folgenden Themen: