Данное руководство предназначено для издателей, интегрирующих рекламу, открывающуюся в приложении, с помощью Google Mobile Ads SDK.
Реклама при открытии приложения — это особый формат рекламы, предназначенный для издателей, желающих монетизировать экраны загрузки своих приложений. Рекламу при открытии приложения можно закрыть в любой момент, и она предназначена для показа, когда пользователи выводят приложение на передний план.
В рекламных объявлениях при открытии приложения автоматически отображается небольшая область с логотипом, чтобы пользователи понимали, что они находятся в вашем приложении. Вот пример того, как выглядит рекламное объявление при открытии приложения:

Предварительные требования
- Пройдите руководство по началу работы .
Всегда проводите тестирование с помощью тестовых объявлений.
При разработке и тестировании приложений обязательно используйте тестовые объявления, а не реальные, рабочие объявления. Несоблюдение этого правила может привести к блокировке вашего аккаунта.
Самый простой способ загрузить тестовую рекламу — использовать наш специальный идентификатор тестового рекламного блока для рекламы, открывающей приложение:
ca-app-pub-3940256099942544/9257395921
Он специально настроен на возврат тестовых объявлений для каждого запроса, и вы можете свободно использовать его в своих приложениях во время кодирования, тестирования и отладки. Просто убедитесь, что вы заменили его на свой собственный идентификатор рекламного блока перед публикацией приложения.
Для получения дополнительной информации о том, как работают тестовые объявления в Google Mobile Ads SDK, см. раздел «Включение тестовых объявлений» .
Расширьте класс 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 = "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() {}
Котлин
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
Котлин
Замените 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:24.9.0") implementation("androidx.lifecycle:lifecycle-process:2.8.3") }
Классный
dependencies { implementation 'com.google.android.gms:play-services-ads:24.9.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);
}
Котлин
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
Следующие шаги
Изучите следующие темы: