Объявления при запуске приложения

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

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

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

Требования

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

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

Самый простой способ загрузить тестовые объявления – использовать специальный идентификатор рекламного блока для объявлений при запуске приложения:

ca-app-pub-3940256099942544/9257395921

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

Подробнее о том, 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();
  }

Kotlin

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

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

  override fun onCreate() {
    super<Application>.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, чтобы инкапсулировать работу, связанную с загрузкой и показом объявлений при запуске приложения:

Java

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;

  /** 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() {}

Kotlin

private inner class AppOpenAdManager {

  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 AdRequest.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;
      }
    });

Kotlin

AppOpenAd.load(
  context,
  "AD_UNIT_ID",
  AdRequest.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);
}

Kotlin

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.");
      }
    });

Kotlin

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);
}

Kotlin

/** 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) {}

Kotlin

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, который затем будете использовать для показа объявления при запуске приложения.

Как отслеживать события перехода приложения в активный режим

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

Как добавить библиотеки в файл Gradle

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

Kotlin

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

Groovy

  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);
  // Show the ad (if available) when the app moves to foreground.
  appOpenAdManager.showAdIfAvailable(currentActivity);
}

Kotlin

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

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

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

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

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

Рекомендации

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

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

Примеры на GitHub

  • Пример объявлений при запуске приложения:Java | Kotlin

Дальнейшие действия

Ознакомьтесь со следующими темами: