开屏广告
开屏广告是一种特殊的广告格式,用于通过应用加载屏幕变现。
备注
演示项目 中提供了展示所有格式类型运作原理的示例。
注意
该广告格式仅支持竖屏显示。若使用横屏模式,广告将无法正常展示。
开屏广告创建示例
AppOpenActivity
Kotlin
Java
activity_app_open_ad.xml
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 将监测应用状态:
Kotlin
Java
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 实体:
Kotlin
Java
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