开发KMM库时,Android端共享模块如何获取Context?
在KMM共享模块Android部分获取Context的方案
方案一:构造函数注入Context(推荐)
这是最符合依赖注入原则的方式,解耦且便于测试:
- 在
commonMain中定义expect类:
expect class UploadManager { fun execute() }
- 在
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:
- 在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的上下文提供者:
- 在
commonMain中定义:
expect object ContextProvider { fun getApplicationContext(): Any }
- 在
androidMain中实现actual类:
import android.content.Context actual object ContextProvider { lateinit var appContext: Context actual fun getApplicationContext(): Context { return appContext } }
- 在Android应用的
MyApplication中初始化:
override fun onCreate() { super.onCreate() ContextProvider.appContext = applicationContext }
- 在
UploadManager中使用:
import androidx.work.WorkManager actual class UploadManager { actual fun execute() { val context = ContextProvider.getApplicationContext() val workManager = WorkManager.getInstance(context) // 执行上传逻辑 } }
内容的提问来源于stack exchange,提问作者RCH
相关产品推荐
相关产品推荐

