手动在KMM共享库中使用Android应用上下文
手动向KMM通用模块传递Android应用上下文的方案
如果你不想引入额外依赖,完全可以通过手动初始化+平台差异封装的方式传递Android应用上下文,以下是两种可靠的实现方式:
方式一:全局上下文持有者(单例模式)
这种方式适合需要在模块多处使用上下文的场景,通过KMM的expect/actual机制封装平台差异,确保通用模块能安全访问Android上下文:
- 在通用模块的
commonMain中定义期望的持有者接口:
expect object AppContextHolder { var appContext: Any? }
- 在模块的
androidMain中实现该持有者,将类型指定为Android的Context:
import android.content.Context actual object AppContextHolder { actual var appContext: Context? = null }
- 在Android应用的
Application类中手动初始化持有者:
class MyApplication : Application() { override fun onCreate() { super.onCreate() // 传入Application上下文,避免持有Activity导致内存泄漏 AppContextHolder.appContext = this } }
之后在通用模块的Android相关逻辑中,就可以通过AppContextHolder.appContext获取上下文,使用前记得判空确保安全。
方式二:函数参数传递(按需传入)
如果只在特定功能中需要上下文,无需全局持有,可以直接在调用相关功能时传入:
- 在
commonMain中定义带上下文参数的期望函数:
expect fun performPlatformSpecificAction(context: Any)
- 在
androidMain中实现函数,接收Context类型参数:
import android.content.Context actual fun performPlatformSpecificAction(context: Context) { // 在这里使用上下文执行Android平台逻辑 context.getSharedPreferences("my_prefs", Context.MODE_PRIVATE) }
- Android端调用时直接传入上下文:
// 在Activity或Application中调用 performPlatformSpecificAction(this)
关键注意事项
- 优先使用Application上下文,避免持有Activity上下文引发内存泄漏。
- 在通用模块中访问上下文时,要确保仅在Android平台代码路径中调用,不要在iOS相关逻辑中触发,否则会抛出类型错误。
- 全局持有者的初始化必须在
Application.onCreate()中完成,保证上下文在模块功能执行前已就绪。
内容的提问来源于stack exchange,提问作者Azim Ansari
相关产品推荐
相关产品推荐

