You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin实现预加载AdMob插屏广告跨Activity调用报错求助

解决方案

不要尝试通过Intent传递插屏广告实例,AdMob的广告对象本身不支持Parcelable/Serializable序列化,这是Java转Kotlin实现该需求最常见的报错原因。正确的预加载+跨页面调用实现如下:

步骤1:在MainActivity中实现预加载逻辑

通过伴生对象全局持有已加载的插屏广告实例:

class MainActivity : AppCompatActivity() {
    companion object {
        // 全局存储预加载完成的插屏广告
        var preloadedInterstitialAd: InterstitialAd? = null
    }

    private lateinit var adRequest: AdRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 初始化广告请求
        adRequest = AdRequest.Builder().build()
        // 启动预加载
        loadInterstitialAd()
    }

    private fun loadInterstitialAd() {
        InterstitialAd.load(this, "替换为你的AdMob插屏广告单元ID", adRequest,
            object : InterstitialAdLoadCallback() {
                override fun onAdLoaded(interstitialAd: InterstitialAd) {
                    preloadedInterstitialAd = interstitialAd
                    // 配置广告展示回调,用完自动置空避免内存泄漏
                    preloadedInterstitialAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
                        override fun onAdDismissedFullScreenContent() {
                            preloadedInterstitialAd = null
                            // 可选:广告关闭后自动预加载下一次
                            loadInterstitialAd()
                        }

                        override fun onAdFailedToShowFullScreenContent(adError: AdError) {
                            preloadedInterstitialAd = null
                        }
                    }
                }

                override fun onAdFailedToLoad(loadAdError: LoadAdError) {
                    preloadedInterstitialAd = null
                }
            })
    }
}

步骤2:其他Activity调用预加载广告

调用前严格判空适配Kotlin空安全规则:

class OtherActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_other)

        // 需要展示广告的位置调用
        findViewById<Button>(R.id.btn_show_ad).setOnClickListener {
            MainActivity.preloadedInterstitialAd?.let { ad ->
                ad.show(this)
            } ?: run {
                // 广告未加载完成的兜底逻辑,可直接执行业务逻辑或提示用户
                Toast.makeText(this, "广告加载中,请稍后再试", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

常见转Kotlin报错修复点

  • Kotlin空安全检查比Java严格,所有调用广告实例的位置必须判空,否则会触发编译错误
  • 新版AdMob已废弃InterstitialAd(context)构造方法,必须使用静态InterstitialAd.load方法加载,否则会触发方法找不到错误
  • 自动转换Java的匿名接口实现时,需要检查SAM转换是否正确,避免接口方法签名匹配错误

内容的提问来源于stack exchange,提问作者Viks Viks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:21:01