不能直接实现开屏广告
splashscreen 不能直接实现开屏广告,尤其是 Android 12+ 的系统级 SplashScreen API,它的设计目的是:
统一冷启动视觉体验,不是用来展示广告或延时内容。
🔍 为什么系统 SplashScreen 不适合做开屏广告?
限制 | 说明 |
---|---|
✅ 自动消失机制 | SplashScreen 会在主 Activity 第一帧绘制完成后立刻移除,不能展示任意时长 |
✅ 展示内容受限 | 只能设置主题中的 windowSplashScreenAnimatedIcon,不支持加载网络图、视频、复杂布局 |
✅ 系统控制动画 | 动画样式、过渡行为固定,无法插入广告跳过按钮或统计曝光时长 |
✅ 目的不同 | 系统 splash 是为了过渡,而广告需要用户停留、点击、跳过,这与设计理念冲突 |
正确做法:使用主页面或 SplashActivity 承载广告
方法一:主 Activity 中加载广告
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val splashScreen = installSplashScreen()
splashScreen.setKeepOnScreenCondition { viewModel.isLoading }
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
showAdIfNeeded()
}
private fun showAdIfNeeded() {
val adView = findViewById<AdContainerView>(R.id.adContainer)
adView.visibility = View.VISIBLE
adView.loadAd() // 可加载广点通、穿山甲、优量汇等 SDK 广告
}
}
installSplashScreen() 只是负责冷启动过渡,广告要靠 View 层加载
方法二:使用 SplashActivity 展示广告(兼容老方案)
class SplashAdActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash_ad)
AdSdk.loadAd(callback = {
startActivity(Intent(this, MainActivity::class.java))
finish()
})
}
}
可以添加“跳过”按钮、广告倒计时、点击跳转等功能,更自由控制展示逻辑
推荐实践
目标 | 推荐方式 |
---|---|
启动时展示品牌 + 广告(冷启动) | 使用 SplashActivity 展示广告,展示完后再跳转主界面 |
只做冷启动过渡(不展示广告) | 使用系统 SplashScreen API |
动态加载广告(如开屏联盟广告) | SplashActivity + SDK 实现(支持跳过、曝光统计) |
🔧 常用广告 SDK 支持的开屏广告功能
SDK | 支持开屏广告 | 是否可插入在系统 SplashScreen 中 |
---|---|---|
穿山甲(字节跳动) | ✅ 是 | ❌ 否,必须用普通 Activity 展示 |
优量汇(腾讯) | ✅ 是 | ❌ 否 |
AdMob | ✅ 启动插页广告 | ❌ 否,需在主界面中展示 |
百度联盟 | ✅ 是 | ❌ 否 |
总结
• ❌ 系统 SplashScreen 不支持广告逻辑、跳过按钮、曝光统计等特性;
• ✅ 开屏广告需在 App 启动后通过普通 View 或独立 Activity 实现;
• ✅ 推荐方式是主 Activity 中用 FrameLayout 或 PopupWindow 展示广告内容,搭配倒计时或跳过控制。