如何从存储库启动前台服务

How to start a foreground service from a respository

我有一个基于 Kotlin 的 activity 应用程序启动前台服务:

applicationContext.startForegroundService(serviceIntent)

接下来我绑定到服务,以便我可以获得一个 Ibinder 对象并通过消息(双向)与它通信,使用:

bindService(serviceIntent, myConnection, Context.BIND_IMPORTANT)

在我执行的服务的onCreate方法中

startForeground(1, notification) // posts a persistent notification

这样即使用户是 运行 另一个应用程序,该服务也会保持 运行。所有这些都运行良好。

现在我想将应用程序重构为一个承载多个片段 的activity。我想在片段之间共享服务(无论如何有几个)。 (我的片段导航很干净。)

我想遵循 MVVM 设计模式并将 start/stop 服务控件放在存储库 class 中(如 What is the right place to start a service in an MVVM architecture 在 Whosebug 上的建议。

但是,我似乎无法让它工作。我尝试了以下(除其他外!):

  import android.content.Intent
  import androidx.core.content.ContextCompat.startForegroundService

  class myRepository {

    fun initService() {

        val serviceIntent = Intent(this, MyService::class.java)
        startForegroundService(serviceIntent)
 
    }
  }

函数的第一行用红色下划线标出了“Intent”,消息“None 可以使用提供的参数调用以下函数。”

另外,startForegroundService 语句的右括号有一条红色下划线,当悬停在上面时表示“没有为参数 'intent' 传递值。”所以我的 Intent 声明似乎有问题。

有什么简单的(希望如此)我只是想念的吗?它与我的存储库的上下文有关吗?

当您调用“this”时,您指的是实际的 class;在本例中为“MyRepository”。此 class 未绑定到任何 Android 上下文,因此不是您意图的有效参数。您将需要通过构造函数注入应用程序上下文。

无论如何,就MVVM而言,它并没有说应该从哪里启动服务。仅取决于服务要执行的功能。例如,不应从存储库启动音乐服务,因为存储库应该连接到数据层。