我想创建一个可以进行网络操作的服务,但是我希望只要活动处于打开状态就可以运行它。所以我想将其绑定到活动的生命周期中。如果用户导航到另一个活动并返回,我希望它重新启动。如果屏幕消失并且用户重新打开它,我希望它在无法保持的情况下再次启动
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是一个好主意吗?
您基本上都做对了,只是您应该使用onResume
/ onPause
或onStart
/ onStop
,而不要混用这两对。仅当您的活动完全消失时才调用onStart
和onStop
。因此,在您的示例中,如果您面前出现了另一个应用程序的对话框,则不会调用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))
}
}
将回调转换为协程。有一些教程可供您查找。