LWEEK: Pokud je to FirebaseMessagingService, kde zachytáváš onMessageReceived, tak to je IntentService, a nespouští se jako foreground service (která by normálně jela na main threadu), ale na nově vytvořeném worker threadu mimo hlavní vlákno. Pokud máš kromě ní ještě nějakou skutečnou foreground service (tedy s viditelnou notifikací v liště), jejímž účelem je udržet aplikaci při životě, zatímco dělá něco na pozadí, tak ta nemá přímý vliv na životnost jakékoli jiné služby. Ale může ti držet při životě aplikační context. Takže v praxi pokud máš dejme tomu nějaký usecase singleton v aplikačním scopu, který ti tu blocking práci udělá (stáhne data, uloží do DB), tak ho jen provoláš v onMessageReceived a další život té služby, která ho zavolala, tě nemusí zajímat, dokud zůstane naživu aplikace jako taková. U jednoho REST callu se toho ale v zásadě nemusíš bát, ten by měla přežít služba i sama o sobě :-). Předpokládám ale celou dobu nějaké menší nárazové balíčky dat, jejichž ztráta není pro běh aplikace problematická. Android ti totiž nikdy nedokáže garantovat, že proces nechcípne, zejména při zhasnutém displeji. Pokud jde o synchronizaci nějakých větších databází, tak už je samozřejmě WorkManager na místě. I v něm ale můžeš použít CoroutineWorker, popř. spustit coroutine jako runBlocking v normálním doWork. Worker ti vždycky někdy proběhne, akorát úplně nevíš kdy (i u Immediate/Expedited to mohou být řádově minuty, když je systém v doze mode) :-)). Takže tldr; krátké nárazové a postradatelné operace v Coroutině, kterou si vyrobíš v runtime a provedou se hned, dlouhá kontinuální práce ve WorkerManageru, a provede se až systém uzná za vhodné :-).