Реклама при запуске приложения

Выберите платформу: Android iOS Unity Flutter Android (Legacy)

Данное руководство предназначено для издателей, интегрирующих рекламу открытия приложений с использованием Google Mobile Ads SDK (Legacy) .

Реклама при открытии приложения — это особый формат рекламы, предназначенный для издателей, желающих монетизировать экраны загрузки своих приложений. Рекламу при открытии приложения можно закрыть в любой момент, и она предназначена для показа, когда пользователи выводят приложение на передний план.

В рекламных объявлениях при открытии приложения автоматически отображается небольшая область с логотипом, чтобы пользователи понимали, что они находятся в вашем приложении. Вот пример того, как выглядит рекламное объявление при открытии приложения:

Предварительные требования

Всегда проводите тестирование с помощью тестовых объявлений.

При разработке и тестировании приложений обязательно используйте тестовые объявления, а не реальные, рабочие объявления. Несоблюдение этого правила может привести к блокировке вашего аккаунта.

Самый простой способ загрузить тестовую рекламу — использовать наш специальный идентификатор тестового рекламного блока для рекламы, открывающей приложение:

/21775744923/example/app-open

Он специально настроен на возврат тестовых объявлений для каждого запроса, и вы можете свободно использовать его в своих приложениях во время кодирования, тестирования и отладки. Просто убедитесь, что вы заменили его на свой собственный идентификатор рекламного блока перед публикацией приложения.

Для получения дополнительной информации о том, как работают тестовые объявления Google Mobile Ads SDK (Legacy) , см. раздел «Включение тестовых объявлений» .

Расширьте класс Application.

Создайте новый класс, расширяющий класс Application . Это обеспечит управление рекламой с учетом жизненного цикла приложения, а не отдельной Activity .

Java

public class MyApplication extends Application
    implements ActivityLifecycleCallbacks, DefaultLifecycleObserver {

  private AppOpenAdManager appOpenAdManager;
  private Activity currentActivity;

  @Override
  public void onCreate() {
    super.onCreate();
    this.registerActivityLifecycleCallbacks(this);

    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    appOpenAdManager = new AppOpenAdManager();
  }

Котлин

class MyApplication :
  MultiDexApplication(), Application.ActivityLifecycleCallbacks, DefaultLifecycleObserver {

  private lateinit var appOpenAdManager: AppOpenAdManager
  private var currentActivity: Activity? = null

  override fun onCreate() {
    super<MultiDexApplication>.onCreate()
    registerActivityLifecycleCallbacks(this)

    ProcessLifecycleOwner.get().lifecycle.addObserver(this)
    appOpenAdManager = AppOpenAdManager()
  }

Далее добавьте следующий код в файл AndroidManifest.xml :

<!-- TODO: Update to reference your actual package name. -->
<application
    android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>

Реализуйте свой вспомогательный компонент.

Ваша реклама должна отображаться быстро, поэтому лучше всего загружать её до того, как она понадобится. Таким образом, реклама будет готова к показу, как только пользователь зайдёт в ваше приложение.

Реализуйте вспомогательный компонент AppOpenAdManager для инкапсуляции работы, связанной с загрузкой и отображением рекламы App Open:

Java

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;

  /** Keep track of the time an app open ad is loaded to ensure you don't show an expired ad. */
  private long loadTime = 0;

  /** Constructor. */
  public AppOpenAdManager() {}

Котлин

private inner class AppOpenAdManager {

  private val googleMobileAdsConsentManager =
  private var appOpenAd: AppOpenAd? = null
  private var isLoadingAd = false
  var isShowingAd = false

  /** 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

Для использования AppOpenAdManager вызовите публичные методы-обертки экземпляра синглтона MyApplication . Класс Application взаимодействует с остальным кодом, делегируя задачу загрузки и показа рекламы менеджеру.

Загрузить рекламу

Следующий шаг — заполнить метод loadAd и обработать коллбэки загрузки рекламы.

Java

AppOpenAd.load(
    context,
    "AD_UNIT_ID",
    new AdManagerAdRequest.Builder().build(),
    new AppOpenAdLoadCallback() {
      @Override
      public void onAdLoaded(AppOpenAd ad) {
        // Called when an app open ad has loaded.
        Log.d(LOG_TAG, "App open ad 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, "App open ad failed to load with error: " + loadAdError.getMessage());

        isLoadingAd = false;
      }
    });

Котлин

AppOpenAd.load(
  context,
  "AD_UNIT_ID",
  AdManagerAdRequest.Builder().build(),
  object : AppOpenAdLoadCallback() {
    override fun onAdLoaded(ad: AppOpenAd) {
      // Called when an app open ad has loaded.
      Log.d(LOG_TAG, "App open ad 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, "App open ad failed to load with error: " + loadAdError.message)

      isLoadingAd = false
    }
  },
)

Замените AD_UNIT_ID на идентификатор вашего рекламного блока.

Показать рекламу

Наиболее распространенный способ реализации рекламы при открытии приложения — это попытка показать рекламу, связанную с открытием приложения, вскоре после его запуска, запуск контента приложения, если реклама еще не готова, и предварительная загрузка другой рекламы для следующей возможности открытия приложения. Примеры реализации см. в руководстве по рекламе при открытии приложения .

Следующий код отображает рекламу, а затем перезагружает её:

Java

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(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 (appOpenAd == null) {
    Log.d(TAG, "The app open ad is not ready yet.");
    onShowAdCompleteListener.onShowAdComplete();
    // Load an ad.
    return;
  }

  isShowingAd = true;
  appOpenAd.show(activity);
}

Котлин

fun showAdIfAvailable(activity: Activity, onShowAdCompleteListener: OnShowAdCompleteListener) {
  // If the app open ad is already showing, do not show the ad again.
  if (isShowingAd) {
    Log.d(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 (appOpenAd == null) {
    Log.d(TAG, "The app open ad is not ready yet.")
    onShowAdCompleteListener.onShowAdComplete()
    // Load an ad.
    return
  }

  isShowingAd = true
  appOpenAd?.show(activity)
}

Установите функцию обратного вызова для полноэкранного контента (FullScreenContentCallback).

Функция FullScreenContentCallback обрабатывает события, связанные с отображением вашей AppOpenAd . Перед показом AppOpenAd обязательно установите функцию обратного вызова:

Java

appOpenAd.setFullScreenContentCallback(
    new FullScreenContentCallback() {
      @Override
      public void onAdDismissedFullScreenContent() {
        // Called when full screen content is dismissed.
        Log.d(TAG, "Ad dismissed fullscreen content.");
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        appOpenAd = null;
        isShowingAd = false;

        onShowAdCompleteListener.onShowAdComplete();
        // Load an ad.
      }

      @Override
      public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
        // Called when full screen content failed to show.
        Log.d(TAG, adError.getMessage());
        appOpenAd = null;
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        isShowingAd = false;

        onShowAdCompleteListener.onShowAdComplete();
        // Load an ad.
      }

      @Override
      public void onAdShowedFullScreenContent() {
        Log.d(TAG, "Ad showed fullscreen content.");
      }

      @Override
      public void onAdImpression() {
        // Called when an impression is recorded for an ad.
        Log.d(TAG, "The ad recorded an impression.");
      }

      @Override
      public void onAdClicked() {
        // Called when ad is clicked.
        Log.d(TAG, "The ad was clicked.");
      }
    });

Котлин

appOpenAd?.fullScreenContentCallback =
  object : FullScreenContentCallback() {
    override fun onAdDismissedFullScreenContent() {
      // Called when full screen content is dismissed.
      Log.d(TAG, "Ad dismissed fullscreen content.")
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      appOpenAd = null
      isShowingAd = false

      onShowAdCompleteListener.onShowAdComplete()
      // Load an ad.
    }

    override fun onAdFailedToShowFullScreenContent(adError: AdError) {
      // Called when full screen content failed to show.
      Log.d(TAG, adError.message)
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      appOpenAd = null
      isShowingAd = false

      onShowAdCompleteListener.onShowAdComplete()
      // Load an ad.
    }

    override fun onAdShowedFullScreenContent() {
      Log.d(TAG, "Ad showed fullscreen content.")
    }

    override fun onAdImpression() {
      // Called when an impression is recorded for an ad.
      Log.d(TAG, "The ad recorded an impression.")
    }

    override fun onAdClicked() {
      // Called when ad is clicked.
      Log.d(TAG, "The ad was clicked.")
    }
  }

Учитывайте истечение срока действия рекламы.

Чтобы избежать показа устаревшей рекламы, добавьте в AppOpenAdManager метод, который проверяет, сколько времени прошло с момента загрузки ссылки на вашу рекламу. Затем используйте этот метод, чтобы проверить, актуальна ли реклама до сих пор.

Java

/** Check if ad was loaded more than n hours ago. */
private boolean wasLoadTimeLessThanNHoursAgo(long numHours) {
  long dateDifference = (new Date()).getTime() - loadTime;
  long numMilliSecondsPerHour = 3600000;
  return (dateDifference < (numMilliSecondsPerHour * numHours));
}

/** Check if ad exists and can be shown. */
private boolean isAdAvailable() {
  // For time interval details, see: https://support.google.com/admob/answer/9341964
  return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4);
}

Котлин

/** 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 {
  // For time interval details, see: https://support.google.com/admob/answer/9341964
  return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4)
}

Следите за текущей активностью

Для показа рекламы вам потребуется контекст Activity . Чтобы отслеживать наиболее актуальную используемую активность, зарегистрируйте и реализуйте Application.ActivityLifecycleCallbacks .

Java

@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {}

@Override
public void onActivityStarted(@NonNull Activity activity) {
  // An ad activity is started when an ad is showing, which could be AdActivity class from Google
  // SDK or another activity class implemented by a third party mediation partner. Updating the
  // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
  // one that shows the ad.
  if (!appOpenAdManager.isShowingAd) {
    currentActivity = activity;
  }
}

@Override
public void onActivityResumed(@NonNull Activity activity) {}

@Override
public void onActivityPaused(@NonNull Activity activity) {}

@Override
public void onActivityStopped(@NonNull Activity activity) {}

@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}

@Override
public void onActivityDestroyed(@NonNull Activity activity) {}

Котлин

override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}

override fun onActivityStarted(activity: Activity) {
  // An ad activity is started when an ad is showing, which could be AdActivity class from Google
  // SDK or another activity class implemented by a third party mediation partner. Updating the
  // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
  // one that shows the ad.
  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) {}

registerActivityLifecycleCallbacks позволяет отслеживать все события Activity . Отслеживая запуск и завершение Activity, вы можете сохранять ссылку на текущую Activity , которую затем будете использовать для показа рекламы при открытии приложения.

Отслеживайте события, приводящие приложение в активный режим.

Чтобы отслеживать события, происходящие в фоновом режиме приложения, выполните следующие действия:

Добавьте библиотеки в свой файл gradle.

Чтобы получать уведомления о событиях, происходящих в фоновом режиме приложения, необходимо зарегистрировать DefaultLifecycleObserver . Добавьте его зависимость в файл сборки вашего приложения:

Котлин

  dependencies {
    implementation("com.google.android.gms:play-services-ads:25.5.0")
    implementation("androidx.lifecycle:lifecycle-process:2.8.3")
  }

Классный

  dependencies {
    implementation 'com.google.android.gms:play-services-ads:25.5.0'
    implementation 'androidx.lifecycle:lifecycle-process:2.8.3'
  }

Реализуйте интерфейс наблюдателя жизненного цикла.

Для отслеживания событий, происходящих в фоновом режиме, можно реализовать интерфейс DefaultLifecycleObserver .

Реализуйте метод onStart() для показа рекламы открытия приложения.

Java

@Override
public void onStart(@NonNull LifecycleOwner owner) {
  DefaultLifecycleObserver.super.onStart(owner);
  appOpenAdManager.showAdIfAvailable(currentActivity);
}

Котлин

override fun onStart(owner: LifecycleOwner) {
  super.onStart(owner)
  currentActivity?.let {
    // Show the ad (if available) when the app moves to foreground.
    appOpenAdManager.showAdIfAvailable(it)
  }
}

Холодный запуск и экраны загрузки

В документации до сих пор предполагалось, что вы показываете рекламу приложения только тогда, когда пользователи переводят приложение в активное состояние, когда оно приостановлено в памяти. «Холодный запуск» происходит, когда ваше приложение запускается, но ранее не было приостановлено в памяти.

An example of a cold start is when a user opens your app for the first time. With cold starts, you won't have a previously loaded app open ad that's ready to be shown right away. The delay between when you request an ad and receive an ad back can create a situation where users are able to briefly use your app before being surprised by an out-of-context ad. Avoid this because it's a bad user experience.

Предпочтительный способ использования рекламы при холодном запуске приложения — это использование экрана загрузки для отображения игровых или других ресурсов приложения и показ рекламы только с этого экрана. Если загрузка приложения завершена и пользователь перешёл к основному контенту, рекламу показывать не следует.

Передовые методы

Реклама при открытии приложения помогает монетизировать экран загрузки вашего приложения, при первом запуске и при переключении между приложениями, но важно помнить о лучших практиках, чтобы ваши пользователи получали удовольствие от использования вашего приложения. Лучше всего:

  • Первое рекламное объявление о запуске приложения будет показано после того, как пользователи несколько раз воспользуются вашим приложением.
  • Показывайте рекламу приложения в то время, когда пользователи обычно ждут загрузки приложения.
  • Если под открытой рекламой приложения отображается экран загрузки, и загрузка завершается до того, как реклама будет закрыта, возможно, вам следует закрыть экран загрузки в методе onAdDismissedFullScreenContent() .

Примеры на GitHub

  • Пример открытия рекламы в приложении: Java | Kotlin

Следующие шаги

Изучите следующие темы: