Межстраничная реклама

Межстраничная реклама (Interstitial) — полноэкранный формат рекламы, встраиваемый в контент приложения во время естественных пауз, таких как переход между уровнями игры или окончание выполнения целевого действия.

Примечание

Пример работы всех типов форматов есть в демопроекте.

Сущность

Описание

onAdFailedToLoad

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

InterstitialAdEventListener

Не сохраняйте ссылки на ранее отображенные объявления. Вызовите set AddEventListener(null) для ранее отображенных объявлений. Вызовите setAdLoadListener(null) для загрузчика, если он больше не используется. Это освобождает ресурсы и предотвращает утечки памяти.

adUnitId

Используйте:

  • development mode — для работы с демоблоками;

  • production mode — для работы с R-M-XXXXXX-Y (уточните реальный ID в интерфейсе Рекламной сети Яндекса). R-M-XXXXXX-Y — это вид рабочего рекламного ID, по которому будут приходить разные креативы.

Пример создания межстраничной рекламы с готовым xml

class InterstitialAdActivity : AppCompatActivity(), InterstitialAdEventListener {

    private var interstitialAd: InterstitialAd? = null
    private lateinit var interstitialAdLoader: InterstitialAdLoader
    private lateinit var binding: ActivityInterstitialAdBinding
    private val adUnitId = "demo-interstitial-yandex" // Use R-M-XXXXXX-Y or demo-block (look for the description below)
    private val config = AdRequestConfiguration.Builder(adUnitId).build()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityInterstitialAdBinding.inflate(layoutInflater)
        setContentView(binding.root)

        interstitialAdLoader = InterstitialAdLoader(this)
        binding.showBanner.isEnabled = false

        binding.loadBanner.setOnClickListener { loadAd() }
        binding.showBanner.setOnClickListener { showAd() }

        interstitialAdLoader.setAdLoadListener(object : InterstitialAdLoadListener {
            override fun onAdLoaded(ad: InterstitialAd) {
                interstitialAd = ad
                binding.showBanner.isEnabled = true
            }

            override fun onAdFailedToLoad(error: AdRequestError) {
                binding.showBanner.isEnabled = false
            }
        })
    }

    private fun loadAd() {
        binding.showBanner.isEnabled = false
        interstitialAdLoader.loadAd(config)
    }

    private fun showAd() {
        interstitialAd?.apply {
            setAdEventListener(this@InterstitialAdActivity)
            show(this@InterstitialAdActivity)
        } ?: run {
        }
    }

    override fun onDestroy() {
        interstitialAd?.setAdEventListener(null)
        interstitialAd = null
        interstitialAdLoader.setAdLoadListener(null)
        super.onDestroy()
    }

    override fun onAdClicked() {}
    override fun onAdDismissed() {
        interstitialAdLoader.loadAd(config)
    }
    override fun onAdFailedToShow(adError: AdError) {}
    override fun onAdImpression(impressionData: ImpressionData?) {}
    override fun onAdShown() {}
}
public class InterstitialAdActivity extends AppCompatActivity implements InterstitialAdEventListener {

    private InterstitialAd interstitialAd = null;
    private InterstitialAdLoader interstitialAdLoader;
    private ActivityInterstitialAdBinding binding;

    private final String adUnitId = "demo-interstitial-yandex"; // Use R-M-XXXXXX-Y or demo-block (look for the description below)
    private final AdRequestConfiguration config = new AdRequestConfiguration.Builder(adUnitId).build();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityInterstitialAdBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        interstitialAdLoader = new InterstitialAdLoader(this);
        binding.showBanner.setEnabled(false);

        binding.loadBanner.setOnClickListener(v -> loadAd());
        binding.showBanner.setOnClickListener(v -> showAd());

        interstitialAdLoader.setAdLoadListener(new InterstitialAdLoadListener() {
            @Override
            public void onAdLoaded(@Nullable InterstitialAd ad) {
                interstitialAd = ad;
                binding.showBanner.setEnabled(true);
            }

            @Override
            public void onAdFailedToLoad(@Nullable AdRequestError error) {
                binding.showBanner.setEnabled(false);
            }
        });
    }

    private void loadAd() {
        binding.showBanner.setEnabled(false);
        interstitialAdLoader.loadAd(config);
    }

    private void showAd() {
        if (interstitialAd != null) {
            interstitialAd.setAdEventListener(this);
            interstitialAd.show(this);
        }
    }

    @Override
    protected void onDestroy() {
        if (interstitialAd != null) {
            interstitialAd.setAdEventListener(null);
            interstitialAd = null;
        }
        if (interstitialAdLoader != null) {
            interstitialAdLoader.setAdLoadListener(null);
        }
        super.onDestroy();
    }
    @Override
    public void onAdClicked() {}
    @Override
    public void onAdDismissed() {
        interstitialAdLoader.loadAd(config);
    }
    @Override
    public void onAdFailedToShow(@Nullable AdError adError) {}
    @Override
    public void onAdImpression(@Nullable ImpressionData impressionData) {}
    @Override
    public void onAdShown() {}
}
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/coordinatorLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".InterstitialAdActivity">

    <Button
        android:id="@+id/loadBanner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Load Banner"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent" />

    <Button
        android:id="@+id/showBanner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Show Banner"
        app:layout_constraintTop_toBottomOf="@id/loadBanner"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:layout_marginTop="16dp" />

</androidx.constraintlayout.widget.ConstraintLayout>

Пример создания межстраничной рекламы с программным созданием Activity

class InterstitialAdActivity : AppCompatActivity(), InterstitialAdEventListener, InterstitialAdLoadListener {

    private lateinit var interstitialAdLoader: InterstitialAdLoader
    private var interstitialAd: InterstitialAd? = null

    private lateinit var loadButton: Button
    private lateinit var showButton: Button

    private val adUnitId = "demo-interstitial-yandex" // Use R-M-XXXXXX-Y or demo-block (look for the description below)
    val config = AdRequestConfiguration.Builder(adUnitId).build()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val rootLayout = ConstraintLayout(this).apply {
            layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
        }

        loadButton = Button(this).apply {
            text = "Load Interstitial"
            id = View.generateViewId()
        }

        showButton = Button(this).apply {
            text = "Show Interstitial"
            id = View.generateViewId()
            isEnabled = false
        }

        rootLayout.addView(loadButton, LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
            topToTop = LayoutParams.PARENT_ID
            bottomToBottom = LayoutParams.PARENT_ID
            startToStart = LayoutParams.PARENT_ID
            endToEnd = LayoutParams.PARENT_ID
        })

        rootLayout.addView(showButton, LayoutParams(WRAP_CONTENT, WRAP_CONTENT).apply {
            topToBottom = loadButton.id
            startToStart = LayoutParams.PARENT_ID
            endToEnd = LayoutParams.PARENT_ID
            topMargin = 24
        })

        setContentView(rootLayout)
        interstitialAdLoader = InterstitialAdLoader(this)
        loadButton.setOnClickListener { loadAd() }
        showButton.setOnClickListener { showAd() }
        interstitialAdLoader.setAdLoadListener(this@InterstitialAdActivity)
    }

    private fun loadAd() {
        interstitialAd = null
        showButton.isEnabled = false
        interstitialAdLoader.loadAd(config)
    }

    private fun showAd() {
        interstitialAd?.apply {
            setAdEventListener(this@InterstitialAdActivity)
            show(this@InterstitialAdActivity)
        }
    }

    override fun onDestroy() {
        interstitialAd?.setAdEventListener(null)
        interstitialAd = null
        interstitialAdLoader.setAdLoadListener(null)
        super.onDestroy()
    }

    override fun onAdClicked() {}
    override fun onAdDismissed() {
        interstitialAdLoader.loadAd(config)
    }
    override fun onAdFailedToShow(adError: AdError) {}
    override fun onAdImpression(impressionData: ImpressionData?) {}
    override fun onAdShown() {}
    override fun onAdFailedToLoad(error: AdRequestError) {}
    override fun onAdLoaded(interstitialAd: InterstitialAd) {
        this.interstitialAd = interstitialAd
        showButton.isEnabled = true
    }
}
public class InterstitialAdActivity extends AppCompatActivity
        implements InterstitialAdEventListener, InterstitialAdLoadListener {

    private InterstitialAdLoader interstitialAdLoader;
    private InterstitialAd interstitialAd;

    private Button loadButton;
    private Button showButton;

    private final String adUnitId = "demo-interstitial-yandex"; // Use R-M-XXXXXX-Y or demo-block (look for the description below)
    private final AdRequestConfiguration config =
            new AdRequestConfiguration.Builder(adUnitId).build();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ConstraintLayout rootLayout = new ConstraintLayout(this);
        rootLayout.setLayoutParams(new LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        loadButton = new Button(this);
        loadButton.setText("Load Interstitial");
        loadButton.setId(View.generateViewId());

        showButton = new Button(this);
        showButton.setText("Show Interstitial");
        showButton.setId(View.generateViewId());
        showButton.setEnabled(false);

        LayoutParams loadBtnParams = new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        loadBtnParams.topToTop = LayoutParams.PARENT_ID;
        loadBtnParams.bottomToBottom = LayoutParams.PARENT_ID;
        loadBtnParams.startToStart = LayoutParams.PARENT_ID;
        loadBtnParams.endToEnd = LayoutParams.PARENT_ID;
        rootLayout.addView(loadButton, loadBtnParams);

        LayoutParams showBtnParams = new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        showBtnParams.topToBottom = loadButton.getId();
        showBtnParams.startToStart = LayoutParams.PARENT_ID;
        showBtnParams.endToEnd = LayoutParams.PARENT_ID;
        showBtnParams.topMargin = 24;
        rootLayout.addView(showButton, showBtnParams);

        setContentView(rootLayout);

        interstitialAdLoader = new InterstitialAdLoader(this);
        interstitialAdLoader.setAdLoadListener(this);

        loadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadAd();
            }
        });

        showButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showAd();
            }
        });
    }

    private void loadAd() {
        interstitialAd = null;
        showButton.setEnabled(false);
        interstitialAdLoader.loadAd(config);
    }

    private void showAd() {
        if (interstitialAd != null) {
            interstitialAd.setAdEventListener(this);
            interstitialAd.show(this);
        }
    }

    @Override
    protected void onDestroy() {
        if (interstitialAd != null) {
            interstitialAd.setAdEventListener(null);
            interstitialAd = null;
        }
        if (interstitialAdLoader != null) {
            interstitialAdLoader.setAdLoadListener(null);
        }
        super.onDestroy();
    }
    @Override
    public void onAdClicked() {}
    @Override
    public void onAdDismissed() {
        // Optionally reload
        interstitialAdLoader.loadAd(config);
    }
    @Override
    public void onAdFailedToShow(@Nullable AdError adError) {}
    @Override
    public void onAdImpression(@Nullable ImpressionData impressionData) {}
    @Override
    public void onAdShown() {}
    @Override
    public void onAdFailedToLoad(@Nullable AdRequestError error) {}
    @Override
    public void onAdLoaded(InterstitialAd interstitialAd) {
        this.interstitialAd = interstitialAd;
        showButton.setEnabled(true);
    }
}

Проверка интеграции

Соберите и запустите проект. Успешную интеграцию SDK можно проверить в Logcat по ключевому слову YandexAds:

[Integration] Ad type interstitial was integrated successfully