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

开发KMM库时,Android端共享模块如何获取Context?

在KMM共享模块Android部分获取Context的方案

方案一:构造函数注入Context(推荐)

这是最符合依赖注入原则的方式,解耦且便于测试:

  1. 在commonMain中定义expect类:
expect class UploadManager {
    fun execute()
}
  1. 在androidMain中实现actual类,通过构造函数接收Context:
import android.content.Context
import androidx.work.WorkManager

actual class UploadManager(private val context: Context) {
    actual fun execute() {
        val workManager = WorkManager.getInstance(context)
        // 执行上传相关的WorkManager逻辑
    }
}

在Android应用层初始化UploadManager时,传入Application或Activity的Context即可。

方案二:全局Application Context单例

如果不想每次初始化都传入Context,可以通过自定义Application类保存全局Context:

  1. 在Android应用模块中定义自定义Application:
import android.app.Application
import android.content.Context

class MyApplication : Application() {
    companion object {
        lateinit var appContext: Context
            private set
    }

    override fun onCreate() {
        super.onCreate()
        appContext = applicationContext
    }
}

记得在AndroidManifest.xml中指定这个Application类。
2. 在androidMain的UploadManager中直接使用全局Context:

import androidx.work.WorkManager

actual class UploadManager {
    actual fun execute() {
        val workManager = WorkManager.getInstance(MyApplication.appContext)
        // 执行上传逻辑
    }
}

注意:要确保Application已经完成初始化,避免出现UninitializedPropertyAccessException。

方案三:跨平台Context提供者

如果需要统一跨平台的上下文获取逻辑,可以定义一个expect的上下文提供者:

  1. 在commonMain中定义:
expect object ContextProvider {
    fun getApplicationContext(): Any
}
  1. 在androidMain中实现actual类:
import android.content.Context

actual object ContextProvider {
    lateinit var appContext: Context

    actual fun getApplicationContext(): Context {
        return appContext
    }
}
  1. 在Android应用的MyApplication中初始化:
override fun onCreate() {
    super.onCreate()
    ContextProvider.appContext = applicationContext
}
  1. 在UploadManager中使用:
import androidx.work.WorkManager

actual class UploadManager {
    actual fun execute() {
        val context = ContextProvider.getApplicationContext()
        val workManager = WorkManager.getInstance(context)
        // 执行上传逻辑
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:20:41