Это руководство предназначено для издателей, которые интегрируют объявления при запуске приложения с помощью 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
Kotlin
Замените 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
Дальнейшие действия
Ознакомьтесь со следующими темами: