---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.2
alternate:
  - https://ads.yandex.com/helpcenter/en/easy/integration/android/formats/app-open-ads.md
  - https://ads.yandex.com/helpcenter/ru/easy/integration/android/formats/app-open-ads.md
  - https://ads.yandex.com/helpcenter/zh/easy/integration/android/formats/app-open-ads.md
  - href: zh/easy/integration/android/formats/app-open-ads.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/zh/llms.txt

# 开屏广告

<!-- source: zh/easy/_includes/sdk-guide.md -->
开屏广告是一种特殊的广告格式，用于通过应用加载屏幕变现。

{% note alert %}

该广告格式仅支持**竖屏显示**。若使用横屏模式，广告将无法正常展示。

{% endnote %}
<!-- endsource: zh/easy/_includes/sdk-guide.md -->

<!-- source: zh/easy/_includes/notes-android-easy-guide.md -->
{% note info %}

[演示项目](https://ads.yandex.com/helpcenter/zh/easy/integration/android/testing.md#demo) 中提供了展示所有格式类型运作原理的示例。

{% endnote %}
<!-- endsource: zh/easy/_includes/notes-android-easy-guide.md -->

## 开屏广告创建示例

#### AppOpenActivity

{% list tabs %}

- Kotlin

  ```kotlin
  class AppOpenAdActivity : AppCompatActivity() {

      private lateinit var binding: ActivityAppOpenAdBinding

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

- Java

  ```java
  public class AppOpenAdActivity extends AppCompatActivity {

      private ActivityAppOpenAdBinding binding;

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

- activity_app_open_ad.xml

  ```xml
  <androidx.constraintlayout.widget.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/coordinatorLayout"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      tools:context=".AppOpenAdActivity">

  </androidx.constraintlayout.widget.ConstraintLayout>
  ```

{% endlist %}

#### AppOpenManager

AppOpenManager 将监测应用状态：

{% list tabs %}

- Kotlin

  ```kotlin
  class DefaultProcessLifecycleObserver(
      private val onProcessCameForeground: () -> Unit
  ) : DefaultLifecycleObserver {

      override fun onStart(owner: LifecycleOwner) {
          onProcessCameForeground()
      }
  }

  interface DefaultActivityLifecycleCallbacks : Application.ActivityLifecycleCallbacks {
      override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) = Unit
      override fun onActivityStarted(activity: Activity) = Unit
      override fun onActivityResumed(activity: Activity) = Unit
      override fun onActivityPaused(activity: Activity) = Unit
      override fun onActivityStopped(activity: Activity) = Unit
      override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) = Unit
      override fun onActivityDestroyed(activity: Activity) = Unit
  }

  class AppOpenAdManager(application: Application) : AppOpenAdLoadListener, AppOpenAdEventListener {
      private val context: Context = application

      private val processLifecycleObserver = DefaultProcessLifecycleObserver(
          onProcessCameForeground = ::showAppOpenAd
      )
      private val appOpenAdActivityObserver = AppOpenAdActivityObserver()
      private val AD_UNIT_ID = "demo-appopenad-yandex"
      private val appOpenAdLoader = AppOpenAdLoader(application)
      private val adRequestConfiguration = AdRequestConfiguration.Builder(AD_UNIT_ID).build()
      private var loadingInProgress = AtomicBoolean(false)
      private var activityReference: WeakReference<Activity>? = null
      private var appOpenAd: AppOpenAd? = null

      init {
          ProcessLifecycleOwner.get().lifecycle.addObserver(processLifecycleObserver)
          application.registerActivityLifecycleCallbacks(appOpenAdActivityObserver)
      }

      fun initialize() {
          appOpenAdLoader.setAdLoadListener(this)
          // 加载首条广告
          loadAppOpenAd()
      }

      override fun onAdLoaded(appOpenAd: AppOpenAd) {
          // 缓存 appOpenAd 供后续使用
          this.appOpenAd = appOpenAd
          loadingInProgress.set(false)
          Toast.makeText(context, "AppOpenAd loaded", Toast.LENGTH_SHORT).show()
      }

      override fun onAdFailedToLoad(adRequestError: AdRequestError) {
          loadingInProgress.set(false)
          // 自定义广告重新加载逻辑
          // 注意：加载出错时，请避免持续重复加载
          Toast.makeText(context, "AppOpenAd failed to load", Toast.LENGTH_SHORT).show()
      }

      private fun showAppOpenAd() {
          // 当应用程序进入前台时，如果存在已打开的特定活动，则显示 AppOpenAd
          activityReference?.get()
              ?.let(::showAdIfAvailable)
      }

      private fun showAdIfAvailable(activity: Activity) {
          val appOpenAd = appOpenAd
          if (appOpenAd != null) {
              appOpenAd.setAdEventListener(this@AppOpenAdManager)
              appOpenAd.show(activity)
          } else {
              loadAppOpenAd()
          }
      }

      private fun loadAppOpenAd() {
          // 如果没有已加载的广告且新广告未加载，则加载新广告
          if (loadingInProgress.compareAndSet(false, true)) {
              appOpenAdLoader.loadAd(adRequestConfiguration)
          }
      }

      private fun clearAppOpenAd() {
          appOpenAd?.setAdEventListener(null)
          appOpenAd = null
      }

      private inner class AppOpenAdActivityObserver : DefaultActivityLifecycleCallbacks {

          override fun onActivityStarted(activity: Activity) {
              // 选择特定活动以显示 AppOpenAd 的示例
              activityReference = if (activity is AppOpenAdActivity) {
                  WeakReference(activity)
              } else {
                  null
              }
          }
      }
      override fun onAdClicked() {}
      override fun onAdDismissed() {
          clearAppOpenAd()
          loadAppOpenAd()
      }
      override fun onAdFailedToShow(adError: AdError) {}
      override fun onAdImpression(impressionData: ImpressionData?) {}
      override fun onAdShown() {}
  }
  ```

- Java

  ```java
  class DefaultProcessLifecycleObserver implements DefaultLifecycleObserver {
      private final Runnable onProcessCameForeground;

      public DefaultProcessLifecycleObserver(Runnable onProcessCameForeground) {
          this.onProcessCameForeground = onProcessCameForeground;
      }

      @Override
      public void onStart(LifecycleOwner owner) {
          onProcessCameForeground.run();
      }
  }

  interface DefaultActivityLifecycleCallbacks extends Application.ActivityLifecycleCallbacks {
      @Override default void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
      @Override default void onActivityStarted(Activity activity) {}
      @Override default void onActivityResumed(Activity activity) {}
      @Override default void onActivityPaused(Activity activity) {}
      @Override default void onActivityStopped(Activity activity) {}
      @Override default void onActivitySaveInstanceState(Activity activity, Bundle outState) {}
      @Override default void onActivityDestroyed(Activity activity) {}
  }

  public class AppOpenAdManager implements AppOpenAdLoadListener, AppOpenAdEventListener {

      private final Context context;
      private final String AD_UNIT_ID = "demo-appopenad-yandex";
      private final AppOpenAdLoader appOpenAdLoader;
      private final AdRequestConfiguration adRequestConfiguration;
      private final AtomicBoolean loadingInProgress = new AtomicBoolean(false);
      private WeakReference<Activity> activityReference = null;
      private AppOpenAd appOpenAd = null;

      public AppOpenAdManager(Application application) {
          this.context = application;
          this.appOpenAdLoader = new AppOpenAdLoader(application);
          this.adRequestConfiguration = new AdRequestConfiguration.Builder(AD_UNIT_ID).build();

          // 进程生命周期（前台）监听器
          DefaultProcessLifecycleObserver processLifecycleObserver =
                  new DefaultProcessLifecycleObserver(new Runnable() {
                      @Override
                      public void run() {
                          showAppOpenAd();
                      }
                  });
          ProcessLifecycleOwner.get().getLifecycle().addObserver(processLifecycleObserver);

          // 活动生命周期监听器
          application.registerActivityLifecycleCallbacks(new AppOpenAdActivityObserver());
      }

      public void initialize() {
          appOpenAdLoader.setAdLoadListener(this);
          // 加载首条广告
          loadAppOpenAd();
      }

      @Override
      public void onAdLoaded(AppOpenAd appOpenAd) {
          this.appOpenAd = appOpenAd;
          loadingInProgress.set(false);
          Toast.makeText(context, "AppOpenAd loaded", Toast.LENGTH_SHORT).show();
      }

      @Override
      public void onAdFailedToLoad(AdRequestError adRequestError) {
          loadingInProgress.set(false);
          Toast.makeText(context, "AppOpenAd failed to load", Toast.LENGTH_SHORT).show();
      }

      private void showAppOpenAd() {
          Activity activity = (activityReference != null) ? activityReference.get() : null;
          if (activity != null) {
              showAdIfAvailable(activity);
          }
      }

      private void showAdIfAvailable(Activity activity) {
          if (appOpenAd != null) {
              appOpenAd.setAdEventListener(this);
              appOpenAd.show(activity);
          } else {
              loadAppOpenAd();
          }
      }

      private void loadAppOpenAd() {
          if (loadingInProgress.compareAndSet(false, true)) {
              appOpenAdLoader.loadAd(adRequestConfiguration);
          }
      }

      private void clearAppOpenAd() {
          if (appOpenAd != null) {
              appOpenAd.setAdEventListener(null);
              appOpenAd = null;
          }
      }

      private class AppOpenAdActivityObserver implements DefaultActivityLifecycleCallbacks {
          @Override
          public void onActivityStarted(Activity activity) {
              if (activity instanceof AppOpenAdActivity) {
                  activityReference = new WeakReference<>(activity);
              } else {
                  activityReference = null;
              }
          }
      }
      @Override
      public void onAdClicked() {}
      @Override
      public void onAdDismissed() {
          clearAppOpenAd();
          loadAppOpenAd();
      }
      @Override
      public void onAdFailedToShow(AdError adError) {}
      @Override
      public void onAdImpression(ImpressionData impressionData) {}
      @Override
      public void onAdShown() {}
  }
  ```

{% endlist %}

在应用根目录中，初始化 `AppOpenAdManager` 实体：

{% list tabs %}

- Kotlin

  ```kotlin
  class MyApplication: Application() {
      lateinit var appOpenAdManager: AppOpenAdManager
      private val initListener = InitializationListener({print("sdk listener initialized")})

      override fun onCreate() {
          super.onCreate()
          MobileAds.initialize(this, initListener)
          appOpenAdManager = AppOpenAdManager(this)
          appOpenAdManager.initialize()
      }
  }
  ```

- Java

  ```java
  public class MyApplication extends Application {
      public AppOpenAdManager appOpenAdManager;

      private final InitializationListener initListener = new InitializationListener() {
          @Override
          public void onInitializationCompleted() {
              System.out.println("sdk listener initialized");
          }
      };

      @Override
      public void onCreate() {
          super.onCreate();
          MobileAds.initialize(this, initListener);
          appOpenAdManager = new AppOpenAdManager(this);
          appOpenAdManager.initialize();
      }
  }
  ```

{% endlist %}

## 检查集成

<!-- source: zh/easy/_includes/notes-android-easy-guide.md -->
创建并运行您的项目。您可以通过在 **Logcat** 中搜索 `YandexAds` 关键字来检查集成是否成功：
<!-- endsource: zh/easy/_includes/notes-android-easy-guide.md -->

```
[Integration] Ad type App Open was integrated successfully
```
