AdMob破坏了Android 15上的Material You动态颜色更新

移动开发 2026-07-10

一旦我添加

MobileAds.initialize(this)

动态颜色更新就不再起作用。

当我切换操作系统的颜色调色板并返回应用时,颜色不会更新。我需要重启应用程序才能看到更新。把上面的那一行注释掉后,就能正常工作。

我可以通过以下步骤复现:

  • 使用Pixel 8 API 35的模拟器
  • 在Android Studio创建一个新的空白项目
  • 添加实现(implementation("com.google.android.gms:play-services-ads:25.1.0"))
  • 添加一些示例AdMob ID

```

``` * 将以下内容添加到MainActivity的 onCreate

``` 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中推出修复。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章