Ce guide est destiné aux éditeurs qui intègrent des annonces à l'ouverture d'une application à l'aide du SDK Google Mobile Ads pour Android.
Les annonces à l'ouverture d'une application constituent un format spécial destiné aux éditeurs qui souhaitent monétiser leur écran de chargement de l'application. Les annonces à l'ouverture d'une application peuvent être fermées à tout moment. Elles sont conçues pour être diffusées lorsque les utilisateurs placent votre application au premier plan.
Les annonces à l'ouverture d'une application affichent automatiquement une petite zone de marque afin que les utilisateurs sachent qu'ils sont dans votre application. Voici un exemple:
De manière générale, voici les étapes importantes à suivre:
- Étendez la classe
Application
pour initialiser le SDK Google Mobile Ads. - Créez une classe d'utilitaire qui charge une annonce avant que vous deviez l'afficher.
- Chargez une annonce.
- Écouter
ActivityLifecycleCallbacks.
- Diffusez l'annonce et gérez les rappels.
- Implémentez et enregistrez l'interface
LifecycleObserver
pour diffuser une annonce lors d'événements de premier plan.
Conditions préalables
- SDK Google Mobile Ads 19.4.0 ou version ultérieure
- Suivez les instructions de configuration du guide de démarrage.
Toujours tester avec des annonces tests
Lorsque vous créez et testez vos applications, veillez à utiliser des annonces de test plutôt que des annonces de production. À défaut, votre compte risque d'être suspendu.
Le moyen le plus simple de charger des annonces tests consiste à utiliser notre ID de bloc d'annonces test dédié pour les annonces à l'ouverture:
ca-app-pub-3940256099942544/3419835294
Il a été spécialement configuré pour renvoyer des annonces tests à chaque requête. Vous êtes libre de l'utiliser dans vos propres applications lors du codage, des tests et du débogage. Veillez simplement à le remplacer par votre propre ID de bloc d'annonces avant de publier votre application.
Pour en savoir plus sur le fonctionnement des annonces de test du SDK Mobile Ads, consultez Tester les annonces.
Étendre la classe Application
Créez une classe qui étend la classe Application
, puis ajoutez le code suivant pour initialiser le SDK Google Mobile Ads.
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) {} } }
Cela initialise le SDK et fournit le squelette dans lequel vous vous enregistrerez plus tard pour les événements de premier plan d'application.
Ajoutez ensuite le code suivant à AndroidManifest.xml
:
<application
android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>
Veillez à indiquer le véritable nom du package.
Implémenter votre classe d'utilitaire
Votre annonce doit s'afficher rapidement. Il est donc préférable de la charger avant de devoir la diffuser. De cette façon, vous disposez d'une annonce prête à être diffusée dès que l'utilisateur accède à votre application. Implémentez une classe utilitaire pour effectuer des demandes d'annonces lorsque vous devez diffuser l'annonce.
Créez une classe appelée AppOpenAdManager
dans la classe MyApplication
et remplissez-la comme suit:
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 } } }
Maintenant que vous disposez d'une classe utilitaire, vous pouvez l'instancier dans votre classe 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() } }
Charger une annonce
L'étape suivante consiste à renseigner la méthode 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
utilise des méthodes qui sont appelées une fois le chargement de AppOpenAd
terminé.
Suivez votre activité en cours
Pour diffuser l'annonce, vous avez besoin d'un contexte Activity
. Pour suivre l'activité la plus récente utilisée par votre utilisateur, implémentez Application.ActivityLifecycleCallbacks
dans votre classe Application
.
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) {} }
En effectuant le suivi de l'activité actuelle, vous disposez d'un contexte pour diffuser l'annonce. Vous devez maintenant enregistrer cette interface à l'aide de la méthode 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
vous permet d'écouter tous les événements Activity
. En écoutant le début et la destruction d'activités, vous pouvez suivre une référence à la valeur Activity
actuelle, que vous utiliserez ensuite pour présenter votre annonce à l'ouverture d'une application.
Diffuser l'annonce et gérer les événements de rappel en plein écran
Le code suivant indique quand afficher et actualiser par la suite une annonce.
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) } ... } }
L'FullScreenContentCallback
gère des événements tels que la présentation de l'annonce, l'échec de la présentation ou la fermeture de l'annonce. Si un utilisateur revient sur votre application après l'avoir quitté en cliquant sur une annonce à l'ouverture, il s'assure qu'aucune autre annonce à l'ouverture ne lui est présentée.
Écouter les événements de premier plan de l'application
Ajouter les bibliothèques à votre fichier Gradle
Pour être informé des événements de premier plan d'application, vous devez enregistrer un LifecycleObserver
. Commencez par modifier le fichier build.gradle
au niveau de l'application pour inclure les bibliothèques 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:21.5.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"
}
Implémenter l'interface LifecycleObserver
Vous pouvez écouter les événements de premier plan dans votre classe Application
en implémentant l'interface 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. } }) } }
Si vous enregistrez votre LifecycleObserver
, votre application sera informée des événements de lancement et de premier plan de l'application, et pourra diffuser l'annonce aux moments opportuns.
Tenez compte de l'expiration des annonces
Pour vous assurer de ne pas diffuser une annonce arrivée à expiration, ajoutez une méthode pour AppOpenAdManager
qui vérifie le temps écoulé depuis le chargement de votre référence d'annonce. Utilisez ensuite cette méthode pour vérifier si l'annonce est toujours valide.
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) } }
Démarrages à froid et chargement des écrans
Jusqu'à présent, la documentation suppose que vous ne diffusez des annonces à l'ouverture d'une application que lorsque les utilisateurs mettent en avant votre application lorsqu'elle est suspendue en mémoire. Les démarrages à froid ont lieu lorsque votre application est lancée, mais n'a pas été suspendue en mémoire auparavant.
C'est le cas, par exemple, lorsqu'un utilisateur ouvre votre application pour la première fois. Avec les démarrages à froid, aucune annonce à l'ouverture d'une application déjà chargée n'est prête à être diffusée immédiatement. Le délai entre le moment où vous demandez une annonce et celui où vous recevez une annonce peut créer une situation dans laquelle les utilisateurs peuvent brièvement utiliser votre application avant d'être surpris par une annonce hors contexte. Cela doit être évité, car il nuit à l'expérience utilisateur.
Pour diffuser des annonces à l'ouverture d'une application à l'aide d'un écran de chargement, il est préférable d'utiliser un écran de chargement afin de charger les éléments du jeu ou de l'application. Si le chargement de votre application est terminé et que l'utilisateur a accédé au contenu principal de votre application, ne diffusez pas l'annonce.
Bonnes pratiques
Les annonces à l'ouverture d'une application vous aident à monétiser l'écran de chargement de votre application, dès son lancement et lors des changements d'application. Toutefois, il est important de garder à l'esprit les bonnes pratiques suivantes afin que vos utilisateurs apprécient votre application. Il est préférable de:
- Diffusez votre première annonce à l'ouverture de l'application après que vos utilisateurs l'ont utilisée plusieurs fois.
- Diffusez des annonces à l'ouverture pendant que les utilisateurs attendent que votre application se charge.
- Si un écran de chargement s'affiche sous l'annonce à l'ouverture de l'application et qu'il se termine avant que l'annonce ne soit ignorée, vous pouvez ignorer l'écran de chargement dans la méthode
onAdDismissedFullScreenContent()
.