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

手动在KMM共享库中使用Android应用上下文

手动向KMM通用模块传递Android应用上下文的方案

如果你不想引入额外依赖,完全可以通过手动初始化+平台差异封装的方式传递Android应用上下文,以下是两种可靠的实现方式:

方式一:全局上下文持有者(单例模式)

这种方式适合需要在模块多处使用上下文的场景,通过KMM的expect/actual机制封装平台差异,确保通用模块能安全访问Android上下文:

  1. 在通用模块的commonMain中定义期望的持有者接口:
expect object AppContextHolder {
    var appContext: Any?
}
  1. 在模块的androidMain中实现该持有者,将类型指定为Android的Context:
import android.content.Context

actual object AppContextHolder {
    actual var appContext: Context? = null
}
  1. 在Android应用的Application类中手动初始化持有者:
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        // 传入Application上下文,避免持有Activity导致内存泄漏
        AppContextHolder.appContext = this
    }
}

之后在通用模块的Android相关逻辑中,就可以通过AppContextHolder.appContext获取上下文,使用前记得判空确保安全。

方式二:函数参数传递(按需传入)

如果只在特定功能中需要上下文,无需全局持有,可以直接在调用相关功能时传入:

  1. 在commonMain中定义带上下文参数的期望函数:
expect fun performPlatformSpecificAction(context: Any)
  1. 在androidMain中实现函数,接收Context类型参数:
import android.content.Context

actual fun performPlatformSpecificAction(context: Context) {
    // 在这里使用上下文执行Android平台逻辑
    context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE)
}
  1. Android端调用时直接传入上下文:
// 在Activity或Application中调用
performPlatformSpecificAction(this)

关键注意事项

  • 优先使用Application上下文,避免持有Activity上下文引发内存泄漏。
  • 在通用模块中访问上下文时,要确保仅在Android平台代码路径中调用,不要在iOS相关逻辑中触发,否则会抛出类型错误。
  • 全局持有者的初始化必须在Application.onCreate()中完成,保证上下文在模块功能执行前已就绪。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:47:06