如何从服务 Android 调用挂起功能?

Nur*_*lov 3 coroutine android-service kotlin kotlin-coroutines

如何提供范围或如何从服务 Android 调用挂起功能?通常,活动或视图模型为我们提供了范围,从那里我们可以启动暂停但服务中没有类似的东西

Sau*_*rat 11

您可以CoroutineScope使用SupervisorJob可以在onDestroy()方法中取消的a创建自己的。只要您的服务正在使用,使用此范围创建的协程就会一直存在。一旦onDestroy()您的服务被调用,所有以此范围启动的协程都将被取消。

class YourService : Service() {

    private val job = SupervisorJob()
    private val scope = CoroutineScope(Dispatchers.Main + job)

    ...

    fun foo() {
        scope.launch {
            // Call your suspend function
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        job.cancel()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么要在服务范围内使用 Dispatchers.main?您不会使用 Dispatchers.IO 来代替吗? (9认同)
  • Main Disoatcher 完全没问题,我认为这是更好的解决方案!默认情况下,服务也在主线程上运行,因此此范围保留服务的语义。您始终可以使用 IO/'Default 调度程序来包装任何繁重的操作 (4认同)

All*_*bas 5

对我来说就是这样工作的

import androidx.lifecycle.lifecycleScope
class ServiceLife : LifecycleService() {
    private var supervisorJob = SupervisorJob(parent = null)
    override fun onCreate()  {
        super.onCreate()
        val serviceJob = lifecycleScope.launch {
            //some suspend fun
        }
          supervisorJob[serviceJob.key]
          supervisorJob.cancel()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为你的答案是正确的,使用 LifecycleService,但是你在这里不需要 serviceJob 或 SupervisorJob,这个答案看起来确实没有必要,所以生命周期作用域就足够了 (3认同)