Skip to content

Android 插屏广告集成

概述

插屏广告是一种在应用界面切换时全屏展示的广告形式,具有以下特点:

  • 高曝光率
  • 强视觉冲击力
  • 适合应用场景转换时展示
  • 较高的点击率和转化率

集成步骤

参考demo示例的InterstitialAdHelper

1. 初始化插屏广告

在 Activity 或 Fragment 中初始化插屏广告:

kotlin
/**
 * 插屏广告帮助类
 * 
 * 负责插屏广告的加载、展示和生命周期管理
 * 
 * @param activity 上下文Activity
 * @param logger 日志打印工具
 */
class InterstitialAdHelper(private val activity: Activity, private val logger: PrintLogger) {

    /**
     * 插屏广告对象
     * 
     * 用于管理插屏广告的加载、展示和销毁
     */
    private var interstitialAdObject: InterstitialAdObject? = null

    /**
     * 加载插屏广告
     * 
     * 该方法会创建广告配置,初始化插屏广告对象,并设置广告监听器
     * 最后调用load()方法开始加载广告
     */
    fun load() {
        // 创建广告配置对象,设置广告位ID
        val adConfig = UjuAdConfig(
            placementId = DemoConfig.INTERSTITIAL_ID, // 插屏广告位ID
        )
        
        // 初始化插屏广告对象
        interstitialAdObject = InterstitialAdObject(activity, adConfig)
        
        // 设置广告监听器,监听广告的各种事件
        interstitialAdObject?.setAdObjectListener(object : InterstitialAdObjectListener {
            /**
             * 广告加载成功回调
             * 
             * @param placementId 广告位ID
             */
            override fun onLoadSuccess(placementId: String) {
                // 广告加载成功,此时可以展示,建议展示前判断isReady
                logger.add("Interstitial: onLoadSuccess")
            }

            /**
             * 广告加载失败回调
             * 
             * @param error 错误信息
             * @param placementId 广告位ID
             */
            override fun onLoadError(
                error: UjuException,
                placementId: String
            ) {
                // 加载失败,记录错误信息
                logger.add("Interstitial: onLoadError:${error.message}")
                DemoLogUtils.e("Interstitial:onLoadError:${error.message}")
            }

            /**
             * 广告展示成功回调
             */
            override fun onAdShow() {
                // 获取广告信息,记录ecpm值
                val adInfo = interstitialAdObject?.getAdInfo()
                logger.add("Interstitial: onAdShow:ecpm:${adInfo?.ecpm}")
                DemoLogUtils.d("Interstitial: onAdShow:ecpm:${adInfo?.ecpm}")
            }

            /**
             * 广告展示过程中出错回调
             * 
             * @param error 错误信息
             * @param placementId 广告位ID
             */
            override fun onAdError(
                error: UjuException,
                placementId: String
            ) {
                // 记录广告错误信息
                logger.add("Interstitial: onAdError:${error.message}")
                DemoLogUtils.e("Interstitial:onAdError:${error.message}")
            }

            /**
             * 广告播放完成回调
             */
            override fun onAdPlayComplete() {
                // 记录广告播放完成事件
                logger.add("Interstitial: onAdPlayComplete")
            }

            /**
             * 广告被点击回调
             */
            override fun onAdClicked() {
                // 记录广告点击事件
                logger.add("Interstitial: onAdClicked")
            }

            /**
             * 广告落地页关闭回调
             */
            override fun onLpClosed() {
                // 记录落地页关闭事件
                logger.add("Interstitial: onLpClosed")
            }

            /**
             * 广告关闭回调
             */
            override fun onAdClosed() {
                // 销毁广告对象,释放资源
                interstitialAdObject?.destroy()
                interstitialAdObject = null
                // 记录广告关闭事件
                logger.add("Interstitial: onAdClosed")
            }
        })
        
        // 开始加载广告
        interstitialAdObject?.load()
        // 记录加载广告的事件
        logger.add("Interstitial: load, placementId:${adConfig.placementId}")
        DemoLogUtils.d("Interstitial: load, placementId:${adConfig.placementId}")
    }

    /**
     * 展示插屏广告
     * 
     * 在展示广告前,会检查广告是否已准备就绪
     * 只有当广告状态为ready时,才会调用show()方法展示广告
     */
    fun show() {
        // 检查广告是否已准备就绪
        if (interstitialAdObject?.isReady() == true) {
            // 广告已准备就绪,展示广告
            interstitialAdObject?.show(activity)
        } else {
            // 广告未准备就绪,记录日志
            logger.add("Interstitial: 广告还未准备好")
        }
    }

    /**
     * 检查广告是否已加载
     * 
     * @return true表示广告对象已创建,false表示未创建
     * 注意:此方法仅检查广告对象是否存在,不保证广告已准备就绪
     * 要检查广告是否可展示,请使用isReady()方法
     */
    fun isLoaded(): Boolean {
        return interstitialAdObject != null
    }

    /**
     * 销毁广告对象
     * 
     * 当不再需要广告时,调用此方法销毁广告对象,释放资源
     */
    fun destroy() {
        // 销毁广告对象
        interstitialAdObject?.destroy()
        // 置空广告对象引用
        interstitialAdObject = null
    }
}

2. 展示插屏广告

在合适的时机展示插屏广告,例如游戏关卡完成、应用启动、页面切换等:

kotlin
/**
 * 展示插屏广告
 * 
 * 检查广告是否已加载,如果已加载则展示,否则重新加载
 */
private fun showInterstitialAd() {
    if (interstitialAdObject != null && interstitialAdObject?.isReady() == true) {
        // 广告已加载,展示广告
        interstitialAdObject?.show(activity)
    } else {
        // 广告未加载,提示用户或重新加载
        Log.d("InterstitialAd", "广告未加载,重新加载")
        interstitialAdObject?.load()
    }
}

3. 广告展示时机

插屏广告适合在以下场景展示:

kotlin
// 场景1:游戏关卡完成
private fun onLevelComplete() {
    // 关卡完成逻辑
    // ...
    
    // 展示插屏广告
    showInterstitialAd()
}

// 场景2:应用启动后
private fun onAppStarted() {
    // 应用启动逻辑
    // ...
    
    // 延迟展示插屏广告,让用户先看到应用内容
    Handler(Looper.getMainLooper()).postDelayed({ showInterstitialAd() }, 3000)
}

// 场景3:页面切换
private fun onPageChanged() {
    // 页面切换逻辑
    // ...
    
    // 展示插屏广告
    showInterstitialAd()
}

最佳实践

1. 广告展示策略

  • 合理的展示频率:避免过于频繁展示,影响用户体验
  • 合适的展示时机:在用户自然的操作间隙展示
  • 预加载策略:提前加载广告,确保在需要时能够立即展示
  • 频率控制:设置广告展示的时间间隔或次数限制

2. 优化建议

  • 预加载广告:在应用启动时就开始加载广告
  • 广告缓存:实现广告缓存机制,提高展示速度
  • 失败处理:广告加载失败时,提供合理的备选方案
  • 用户体验:确保广告不影响应用的核心功能

3. 避免的问题

  • 不要在用户关键操作时强制展示广告
  • 不要在应用启动时立即展示广告(建议延迟几秒)
  • 不要设置过短的广告展示间隔
  • 不要在同一用户会话中展示过多广告

常见问题

Q: 插屏广告为什么不显示?

A: 可能的原因:

  • 广告单元 ID 不正确
  • 网络连接问题
  • 广告库存不足
  • 广告未加载完成
  • 设备限制

Q: 如何提高插屏广告的效果?

A: 建议:

  • 选择合适的广告展示时机
  • 优化广告加载和展示策略
  • 确保广告与应用内容相关
  • 提高应用用户活跃度
  • 分析广告效果数据,不断优化

Q: 插屏广告可以在后台线程中加载吗?

A: 可以,但需要注意:

  • 广告的创建和加载需要在主线程进行
  • 可以使用 Handler 或 AsyncTask 来管理加载时机
  • 确保在 UI 线程中展示广告

相关链接