创建在活动打开时运行的服务

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

我想创建一个可以进行网络操作的服务,但是我希望只要活动处于打开状态就可以运行它。所以我想将其绑定到活动的生命周期中。如果用户导航到另一个活动并返回,我希望它重新启动。如果屏幕消失并且用户重新打开它,我希望它在无法保持的情况下再次启动

class PushService: Service() {

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // ToDo Create the request that i want
    }
}

所以我必须在Activity的onResume和onStop中启动和停止服务?

 override fun onResume() {
        super.onResume()

        Intent(this, PushService::class.java).also { intent ->
            startService(intent)
        }
    }

    override fun onStop() {
        super.onStop()

        stopService(Intent(this, PushService::class.java))
    }

不知道该怎么做。有人知道正确的方法吗?

也许只在ViewModel内创建我想要的过程而不是为其启动Service是一个好主意吗?

android kotlin android-activity service
1个回答
1
投票

您基本上都做对了,只是您应该使用onResume / onPauseonStart / onStop,而不要混用这两对。仅当您的活动完全消失时才调用onStartonStop。因此,在您的示例中,如果您面前出现了另一个应用程序的对话框,则不会调用onStop,但是会调用onResume,因此您已经启动的服务将获得多个onStartCommand调用。

但是,服务的重点是运行在您的应用不可见时继续的操作。如果您不这样做,则编写自己的类(可能实现LifecycleObserver或从Activity借用lifecycleScope)会更容易处理后台工作。这样,您就不必在清单中注册它并处理意图了。

LifecycleObserver的示例:

lifecycleScope

我在与人际网络方面做得并不多。但是,无论使用哪种库,通常都可以使用// lifecycle is a property of AppCompatActivity. You can instantiate this class // from your activity.onCreate() class MyNeworkTaskManager(lifecycle: Lifecycle): LifecycleObserver, CoroutineScope by lifecycle.coroutineScope { init { lifecycle.addObserver(this) } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) private fun onResume() { startMyRequest() } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) private fun onPause() { pauseOrCancelMyRequest() } // Alternatively, if you want to expose suspend functions so your activity can request // and respond to data in a coroutine without callbacks: suspend fun getMyData(args: String): MyData { val results = someNetworkRequestSuspendFunction(args) return MyData(results) } // Or if you want to use coroutines for your network request, but still want // your activity to use callbacks so it doesn't have to use coroutines to call // these functions: fun getMyDataAsync(args: String, callback: (MyData) -> Unit) = launch { val results = someNetworkRequestSuspendFunction(args) callback(MyData(results)) } } 将回调转换为协程。有一些教程可供您查找。

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