App open ads

App open ads are a special ad format for monetizing your app load screens.

Alert

This ad format only supports vertical orientation. When horizontal orientation is used, these ads aren't served.

Note

Examples showing how all the format types work are available in the demo project.

Entity

Description

adUnitId

Use:

  • Development mode to work with demo ad units.

  • Production mode to work with R-M-XXXXXX-Y (for the actual ID, check the Yandex Advertising Network interface). R-M-XXXXXX-Y is a template for your actual ad unit ID that will be used to receive various creatives.

Example of creating an app open ad

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:yandex_mobileads/mobile_ads.dart';

class AppOpenPage extends StatefulWidget {
  const AppOpenPage({super.key});

  @override
  State<AppOpenPage> createState() => _AppOpenPageState();
}

class _AppOpenPageState extends State<AppOpenPage> with WidgetsBindingObserver {
  static const _tag = 'AppOpen';
  static const _adUnitId = 'demo-appopenad-yandex';

  AppOpenAdLoader? _loader;
  AppOpenAd? _ad;
  String _status = 'Initializing...';
  bool _wasInBackground = false;
  static bool _isShowing = false;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _init();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _ad?.destroy();
    super.dispose();
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    debugPrint('[$_tag] Lifecycle: $state');
    if (state == AppLifecycleState.paused) {
      _wasInBackground = true;
    } else if (state == AppLifecycleState.resumed && _wasInBackground && _ad != null && !_isShowing) {
      _wasInBackground = false;
      _show();
    }
  }

  Future<void> _init() async {
    setState(() => _status = 'Creating loader...');

    _loader = await AppOpenAdLoader.create(
      onAdLoaded: (ad) {
        debugPrint('[$_tag] onAdLoaded');
        if (!mounted) { ad.destroy(); return; }
        _ad = ad;
        setState(() => _status = 'Ready!\n\nMinimize app and return to show ad');
      },
      onAdFailedToLoad: (error) {
        debugPrint('[$_tag] onAdFailedToLoad: ${error.description}');
        if (mounted) setState(() => _status = 'Error: ${error.description}');
      },
    );

    setState(() => _status = 'Loading ad...');

    await _loader!.loadAd(
      adRequestConfiguration: AdRequestConfiguration(adUnitId: _adUnitId),
    );
  }

  Future<void> _show() async {
    final ad = _ad;
    if (ad == null || _isShowing) return;
    _isShowing = true;

    ad.setAdEventListener(
      eventListener: AppOpenAdEventListener(
        onAdShown: () {
          debugPrint('[$_tag] onAdShown');
          if (mounted) setState(() => _status = 'Showing...');
        },
        onAdDismissed: () {
          debugPrint('[$_tag] onAdDismissed');
          _isShowing = false;
          _ad?.destroy();
          _ad = null;
          if (mounted) setState(() => _status = 'Closed');
        },
        onAdClicked: () => debugPrint('[$_tag] onAdClicked'),
        onAdFailedToShow: (error) {
          debugPrint('[$_tag] onAdFailedToShow: ${error.description}');
          _isShowing = false;
          if (mounted) setState(() => _status = 'Show error: ${error.description}');
        },
        onAdImpression: (ImpressionData impressionData) => debugPrint('[$_tag] onAdImpression: $impressionData'),
      ),
    );

    await ad.show();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('AppOpen')),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(24),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              if (_status.contains('Loading') || _status.contains('Creating'))
                const CircularProgressIndicator(),
              const SizedBox(height: 16),
              Text(_status, textAlign: TextAlign.center),
            ],
          ),
        ),
      ),
    );
  }
}

Checking integration

Build and run your project. You can check if the integration is successful by searching the YandexAds keyword in Logcat in Android Studio:

[Integration] Ad type App Open was integrated successfully