我正在建立前台服务取决于 3 个州。 待定、进行中、完成
此状态带有新数据。状态来自特定 API 的后端,我们称之为:
getStateWithData: GetStateWithDataRepository
所以基本上我调用特定请求来获取数据。
我可以运行前台服务,通过从
request
调用这个viewmodel
来更改数据,然后我创建一个包含新数据的通知一切正常,但是当我关闭我的应用程序当然前台服务仍在运行,但我没有改变我的数据,因为我不再调用 repo。
我的问题是我应该如何实现额外的元素,比如: CoroutineWorker,我将在其中调用数据请求,然后使用前台服务更改通知。 我很不明白我应该只向服务注入
worker
吗?:
// should I add here repo to params?
class MyManager(context: Context) {
// should I just inject workManager, I wanted to add it to another class, but then I couldn't add this MyManager to ViewModel, I have had some problems to inject.
Should I make something like:
val workManager: WorkManager by inject()
// I Call this method from viewmodel to trigger foregrouund service
fun sendCommandToService(
action: String
): Intent = Intent(context, NotificationService::class.java).also {
it.action = action
it.putExtra(
"value",
"valueIsend"
)
context.startService(it)
}
}
另外,根据我的理解,当后端数据发生变化时,我的
ktor
请求将监听这些变化,我可以自动使用这种方法吗?我究竟应该如何实施某种api request
的听众?
是的,这部分来自后端请求的监听器我不太确定。
通常,我会建议无声通知来编辑数据,但我不确定它是否可以不同地工作。
我做了类似的事情:
worker { params ->
NotificationWorkManager(
androidApplication().applicationContext,
params[0]
)
}
single<NotificationManagerImpl> { NotificationManagerImpl(androidApplication().applicationContext, get()) }
...但我无法将它注入 viewModel 我不知道为什么,没有
workmanager
类它有效
来自进口:
/**
* Declare a worker
*
* @author : Fabio de Matos
* @author Arnaud Giuliani
**/
inline fun <reified T : ListenableWorker> Module.worker(
qualifier: Qualifier = named<T>(),
noinline definition: Definition<T>
): KoinDefinition<T> {
val factory = factory(qualifier, definition)
factory.bind(ListenableWorker::class)
return factory
}
在模块中
viewModelOf(::MyViewModel)
来自扩展
/**
* @see viewModelOf
*/
inline fun <reified R : ViewModel, reified T1, reified T2, reified T3, reified T4, reified T5, reified T6, reified T7, reified T8, reified T9, reified T10> Module.viewModelOf(
crossinline constructor: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R,
noinline options: DefinitionOptions<R>? = null,
): KoinDefinition<R> = viewModel { new(constructor) }.onOptions(options)