开屏广告

开屏广告是一种特殊的广告格式,用于通过应用加载屏幕变现。

备注

演示项目 中提供了展示所有格式类型运作原理的示例。

注意

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

开屏广告创建示例

AppOpenActivity

class AppOpenAdActivity : AppCompatActivity() {

    private lateinit var binding: ActivityAppOpenAdBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityAppOpenAdBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}
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());
    }
}
<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>

AppOpenManager

AppOpenManager 将监测应用状态:

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() {}
}
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() {}
}

在应用根目录中,初始化 AppOpenAdManager 实体:

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()
    }
}
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();
    }
}

检查集成

创建并运行您的项目。您可以通过在 Logcat 中搜索 YandexAds 关键字来检查集成是否成功:

[Integration] Ad type App Open was integrated successfully
上一篇
下一篇