如何使用koin进行服务

问题描述 投票:0回答:2

我是通过手动绑定然后使用其方法来启动前台服务的。

但是,我最近遇到了Koin并发现https://insert-koin.io/docs/reference/koin-compose/compose

@Composable
fun App(myService: MyService = koinInject()) {
}

现在,这给了我一个想法,Koin 会为我做绑定,我将能够直接使用 Service 的方法,而无需使用

ServiceConnection

来绑定和解除服务绑定

但是,我明白了,

java.lang.NullPointerException: class name is null

在服务内部调用startForeground。

并且,

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference

开启,任意超级会员来电。

现在,要么我没有正确设置Koin,要么Koin不支持

Service
即使我手动绑定它,但是使用Koin的服务实例它仍然会因同样的问题而崩溃 ).

我想在这里得到专家的意见,因为文档提到了 MyService,但无法使用 SuperClass 'Service' 成员似乎对于类名来说是一个糟糕的选择。

android kotlin koin android-service-binding
2个回答
0
投票

Koin 不会处理 Android 服务生命周期或为您启动前台服务。您仍然需要自己处理这些方面。

如何使用 Koin 与前台服务进行依赖注入的示例:

设置 koin 模块

val myModule = module {
    single { MyService() } // Replace MyService() with your actual implementation of the service
}

在你的应用程序类中初始化Koin

class MyApplication : Application() {
override fun onCreate() {
    super.onCreate()
    startKoin {
        androidContext(this@MyApplication)
        modules(myModule) // Define your Koin modules here
    }
}

}

你的摇篮

implementation "org.koin:koin-core:$koin_version"
implementation "org.koin:koin-androidx-scope:$koin_version"
implementation "org.koin:koin-androidx-viewmodel:$koin_version"
implementation "org.koin:koin-androidx-compose:$koin_version" // If you're using Koin with Compose

在您的 Composable 函数中,您可以使用 koin.get() 注入服务并直接使用它

@Composable
fun App() {
    val myService: MyService = koin.get() // Inject the service

    // Use myService methods here
}

请记住,Koin 不处理 Android 组件(如活动或服务)的生命周期。您需要手动或通过其他组件(例如 Activity、BroadcastReceivers)显式启动和停止服务。


0
投票

koin docs
中的MyService示例不是Android服务,它是一个保存业务逻辑的服务。
service
usecases
是域层类的可互换名称,这些域层类在干净的架构中保存业务逻辑。您可以通过传统方式绑定您的 Android 服务。

© www.soinside.com 2019 - 2024. All rights reserved.