Skip to content

Android 开屏广告集成

概述

开屏广告是一种在应用启动时展示的全屏广告形式,具有以下特点:

  • 高曝光率
  • 适合应用启动场景
  • 强视觉冲击力
  • 较高的点击率和转化率

集成步骤

参考demo示例的SplashAdHelper

1. 创建开屏广告 Activity

使用开屏广告帮助类:

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

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

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

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

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

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

            /**
             * 广告关闭回调
             */
            override fun onAdClosed() {
                // 记录广告关闭事件
                logger.add("Splash: onAdClosed")
                
                // 销毁广告对象,释放资源
                splashAdObject?.destroy()
                splashAdObject = null
            }

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

        // 开始加载广告
        splashAdObject?.load()
        // 记录加载广告的事件
        logger.add("Splash: load, placementId:${adConfig.placementId}")
        DemoLogUtils.d("Splash: load, placementId:${adConfig.placementId}")
    }

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

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

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

2. 创建开屏广告布局

创建 activity_splash.xml 布局文件:

xml
<!-- activity_splash.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/splash_background">
    
    <!-- 应用 logo -->
    <ImageView
        android:id="@+id/app_logo"
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:layout_centerInParent="true"
        android:src="@drawable/app_logo"
        android:visibility="visible"/>
    
    <!-- 广告容器 -->
    <FrameLayout
        android:id="@+id/splash_ad_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"/>
    
    <!-- 跳过按钮 -->
    <Button
        android:id="@+id/skip_button"
        android:layout_width="wrap_content"
        android:layout_height="36dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="40dp"
        android:layout_marginRight="20dp"
        android:background="@drawable/skip_button_bg"
        android:text="跳过"
        android:textColor="@android:color/white"
        android:textSize="14sp"
        android:paddingHorizontal="16dp"
        android:onClick="onSkipClicked"/>
</RelativeLayout>

3. 配置 AndroidManifest.xml

AndroidManifest.xml 中注册开屏广告 Activity:

xml
<activity
    android:name=".SplashActivity"
    android:theme="@style/SplashTheme"
    android:screenOrientation="portrait">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".MainActivity"
    android:theme="@style/AppTheme"/>

4. 创建样式文件

创建 styles.xml 中的开屏主题:

xml
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_background</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

高级配置

1. 自定义跳过按钮

kotlin
// 自定义跳过按钮
val skipButton = findViewById<Button>(R.id.skip_button)
skipButton.setOnClickListener {
    // 跳转到主页面
    gotoMainActivity()
}

2. 加载参数

kotlin
// 在SplashAdHelper的load方法中,可以通过adConfig添加额外参数
val adConfig = UjuAdConfig(
    placementId = DemoConfig.SPLASH_ID,
    // 添加额外的加载参数
    extraParams = mapOf(
        "app_version" to "1.0.0",
        "device_type" to "phone"
    )
)

3. 广告超时处理

kotlin
// 在SplashAdHelper的setAdObjectListener中处理广告超时
override fun onAdError(error: UjuException, placementId: String) {
    logger.add("Splash: onAdError:${error.message}")
    DemoLogUtils.e("onAdError:${error.message}")
    // 广告错误处理,包括超时
    gotoMainActivity()
}

// 或者在Activity中设置超时处理
private val SPLASH_TIMEOUT = 3000L // 3秒超时

// 在onCreate中设置超时任务
handler.postDelayed({ 
    // 超时处理
    gotoMainActivity() 
}, SPLASH_TIMEOUT)

最佳实践

1. 开屏广告优化

  • 设置合理的超时时间:建议 3-5 秒
  • 提供跳过按钮:允许用户跳过广告
  • 预加载策略:在应用启动前就开始加载广告
  • 失败处理:广告加载失败时,确保应用能正常进入主页面

2. 用户体验优化

  • 保持品牌一致性:开屏广告界面应与应用风格一致
  • 避免过度营销:不要在开屏广告中展示过多促销信息
  • 优化加载速度:确保开屏广告能快速加载和展示
  • 频率控制:合理控制开屏广告的展示频率

3. 避免的问题

  • 不要设置过长的广告超时时间
  • 不要在开屏广告中展示与应用无关的内容
  • 不要影响应用的正常启动速度
  • 不要在开屏广告中添加复杂的交互

常见问题

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

A: 可能的原因:

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

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

A: 建议:

  • 设计吸引人的开屏界面
  • 选择合适的广告素材
  • 优化广告加载和展示策略
  • 确保广告与应用内容相关
  • 提高应用用户活跃度

Q: 开屏广告可以在 Fragment 中使用吗?

A: 不建议,开屏广告应该在独立的 Activity 中使用,这样可以:

  • 更好地控制应用启动流程
  • 避免与其他界面的交互冲突
  • 提高广告展示的成功率

代码示例

完整的开屏广告集成示例

使用上面的 SplashAdHelper 类,您可以在开屏 Activity 中轻松集成开屏广告:

kotlin
class SplashActivity : AppCompatActivity() {
    
    private lateinit var splashAdHelper: SplashAdHelper
    private val SPLASH_DISPLAY_TIME = 3000 // 3秒
    private lateinit var handler: Handler
    private lateinit var gotoMainRunnable: Runnable
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)
        
        handler = Handler(Looper.getMainLooper())
        gotoMainRunnable = { gotoMainActivity() }
        
        // 初始化开屏广告帮助类
        splashAdHelper = SplashAdHelper(this, object : PrintLogger {
            override fun add(message: String) {
                Log.d("SplashAd", message)
            }
        })
        
        // 加载开屏广告
        splashAdHelper.load()
        
        // 延迟显示广告,确保广告已加载
        handler.postDelayed({ showSplashAd() }, 500)
    }
    
    private fun showSplashAd() {
        // 获取广告容器
        val adContainer = findViewById<ViewGroup>(R.id.splash_ad_container)
        // 显示广告
        splashAdHelper.show(adContainer)
        
        // 设置跳过按钮点击事件
        findViewById<Button>(R.id.skip_button).setOnClickListener {
            // 跳转到主页面
            gotoMainActivity()
        }
    }
    
    private fun gotoMainActivity() {
        // 移除延迟任务
        handler.removeCallbacks(gotoMainRunnable)
        
        // 跳转到主页面
        val intent = Intent(this, MainActivity::class.java)
        startActivity(intent)
        finish()
    }
    
    override fun onDestroy() {
        super.onDestroy()
        // 清理资源
        handler.removeCallbacks(gotoMainRunnable)
        splashAdHelper.destroy()
    }
}

相关链接