AdMob破坏了Android 15上的Material You动态颜色更新
一旦我添加
MobileAds.initialize(this)
动态颜色更新就不再起作用。
当我切换操作系统的颜色调色板并返回应用时,颜色不会更新。我需要重启应用程序才能看到更新。把上面的那一行注释掉后,就能正常工作。
我可以通过以下步骤复现:
- 使用Pixel 8 API 35的模拟器
- 在Android Studio创建一个新的空白项目
- 添加实现(implementation("com.google.android.gms:play-services-ads:25.1.0"))
- 添加一些示例AdMob ID
```
``` override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)
val systemColor = this.getColor(android.R.color.system_accent1_500)
Log.d("MainActivity", "ColorCheck onCreate. systemColor $systemColor")
MobileAds.initialize(this)
```
现在,在完成系统色调切换后返回应用时,日志始终打印相同的数值,直到我重新启动应用。若不进行MobileAds初始化,运行就正常。
我还找到了一个Google Groups的相同问题的帖子。但看起来该支持已经停止,而且似乎一年多来没有进展。
https://groups.google.com/g/google-admob-ads-sdk/c/_W6lrx8SCdY
有人知道该如何绕过这个问题吗?
编辑: 现在我也看到了这个线程,可能是根本原因:https://issuetracker.google.com/issues/382864248
对我来说,在Android 14以及Android 16的模拟器上可以工作,但在Android 15上不行。
解决方案
你并没有做错什么——这看起来是一个已知的Android 15回归/互操作性问题,涉及动态颜色刷新与 MobileAds.initialize(...) 之间的冲突(与你链接的问题相符)。
发生了什么
在Android 15上,在 MobileAds.initialize(this) 之后,当从系统调色板切换返回时,Activity经常不会获得最新的动态颜色资源状态。因此 getColor(android.R.color.system_accent1_500) 将保持旧态,直到完全重新启动进程。
实用的变通方案
-
延迟广告初始化(风险最低的最佳变通方案):
-
将广告延迟初始化(在首次广告屏幕/首次广告请求时初始化),而不是在
MainActivity.onCreate中。 -
强调色改变时强制重新创建Activity:
-
缓存强调色,在
onResume中进行比较,如果有变化则调用recreate()。 -
检查
configChanges: -
如果清单中对该Activity指定了configChanges,请不要在清单中处理(可能阻塞正常的重新创建流程)。
示例变通方案
class MainActivity : AppCompatActivity() {
private var lastAccent: Int = 0
private var adsInited = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lastAccent = getColor(android.R.color.system_accent1_500)
// Optional: delay instead of init here
// initAdsIfNeeded()
}
override fun onResume() {
super.onResume()
val now = getColor(android.R.color.system_accent1_500)
if (now != lastAccent) {
lastAccent = now
recreate() *// force dynamic color rebind*
return
}
initAdsIfNeeded()
}
private fun initAdsIfNeeded() {
if (adsInited) return
adsInited = true
MobileAds.initialize(this)
}
}
建议
就目前情况,将其视为Android 15与 GMA SDK的上游问题。
在生产环境中,请使用 延迟初始化+ 变更时重新创建的保护机制,直到Google在 Android框架或广告SDK中推出修复。