在KMM中如何在应用启动与关闭时运行共享代码?
实现KMM共享代码的应用生命周期触发与全局状态管理
核心思路
KMM本身没有跨平台的应用生命周期回调,所以需要由两端原生代码在各自的生命周期节点主动触发共享代码的初始化/清理逻辑,同时把全局状态放在共享层的单例类中,确保两端都能访问。
1. 共享模块(KMM)定义入口与全局状态
在共享代码里创建一个单例类,统一管理全局状态和初始化逻辑:
// shared/src/commonMain/kotlin/com/yourpackage/SharedApp.kt object SharedApp { // 全局状态示例,可根据业务定义具体类型 val globalAppState = mutableMapOf<String, Any>() // 共享初始化方法,供两端调用 fun initialize() { // 这里写跨平台的初始化逻辑:比如初始化网络客户端、数据库连接、配置参数等 globalAppState["launchTimestamp"] = System.currentTimeMillis() // 示例:初始化全局网络拦截器 // NetworkClient.initialize() } // 可选:共享资源清理方法,对应应用关闭时的操作 fun cleanup() { // 清理全局状态、关闭连接等 globalAppState.clear() // NetworkClient.shutdown() } }
2. Android端触发共享逻辑
在Application的onCreate(对应应用启动)和onTerminate(对应应用关闭)中调用共享代码:
// app/src/main/kotlin/com/yourpackage/MyApplication.kt class MyApplication : Application() { override fun onCreate() { super.onCreate() // 启动时触发共享初始化 SharedApp.initialize() } override fun onTerminate() { super.onTerminate() // 关闭时触发共享清理 SharedApp.cleanup() } }
3. iOS端触发共享逻辑
根据iOS的生命周期类型选择调用时机:
SwiftUI App生命周期
// iOSApp.swift import SwiftUI import shared @main struct iOSApp: App { init() { // 应用启动时触发共享初始化 SharedApp.shared.initialize() } var body: some Scene { WindowGroup { ContentView() } } // 绑定AppDelegate处理应用关闭逻辑 @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate } class AppDelegate: UIResponder, UIApplicationDelegate { func applicationWillTerminate(_ application: UIApplication) { // 应用关闭时触发共享清理 SharedApp.shared.cleanup() } }
UIKit AppDelegate生命周期
// AppDelegate.swift import UIKit import shared @main class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 应用启动时触发共享初始化 SharedApp.shared.initialize() return true } func applicationWillTerminate(_ application: UIApplication) { // 应用关闭时触发共享清理 SharedApp.shared.cleanup() } }
4. 全局状态的跨端访问
无论是共享代码还是两端平台代码,都可以直接访问SharedApp里的全局状态:
- 共享代码中:
// shared/src/commonMain/kotlin/com/yourpackage/BusinessLogic.kt fun getLaunchTime(): Long { return SharedApp.globalAppState["launchTimestamp"] as Long }
- Android平台代码中:
val launchTime = SharedApp.globalAppState["launchTimestamp"] as Long
- iOS平台代码中:
let launchTime = SharedApp.shared.globalAppState["launchTimestamp"] as! Int64
补充说明
如果需要监听更细粒度的生命周期(比如应用前后台切换),可以沿用相同思路:在共享层定义回调接口,两端原生监听对应事件后调用共享层的方法,实现跨平台的状态同步。
内容的提问来源于stack exchange,提问作者user496854
相关产品推荐
相关产品推荐

