Может ли Service коммуницировать с пользователем

«Может ли Service коммуницировать с пользователем» — вопрос из категории Android компоненты, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сервис не может напрямую взаимодействовать с UI, так как работает в фоне без интерфейса. Однако есть несколько способов коммуникации:

  1. Через Activity - используя BroadcastReceiver или интерфейсы (через Binder в LocalService)
  2. Уведомления - показ Notification через NotificationManager
  3. Обновление данных - через LiveData/Flow, которые наблюдает Activity/Fragment

Пример с BroadcastReceiver:

// В сервисе
val intent = Intent("MY_ACTION").apply {
    putExtra("data", "Hello from Service")
}
sendBroadcast(intent)

// В Activity
val receiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        val data = intent.getStringExtra("data")
        // обновляем UI
    }
}
registerReceiver(receiver, IntentFilter("MY_ACTION"))

Для сложных сценариев лучше использовать ViewModel + LiveData/StateFlow.