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