Какие знаешь способы передачи данных между Fragment и Service

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

Ответ

В Android есть несколько способов передачи данных между Fragment и Service:

  1. Через BroadcastReceiver
    Сервис отправляет Intent с Broadcast, а Fragment регистрирует BroadcastReceiver для его обработки.
    // Service
    val intent = Intent("ACTION_DATA").apply { putExtra("key", value) }
    sendBroadcast(intent)

    // Fragment
    val receiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val data = intent?.getStringExtra("key")
        }
    }
    LocalBroadcastManager.getInstance(context).registerReceiver(receiver, IntentFilter("ACTION_DATA"))
  1. Через LiveData/Flow
    Используется ViewModel или общий Repository для обмена данными. Сервис обновляет LiveData/Flow, а Fragment подписывается на изменения.

  2. Через Messenger/Handler
    Сервис создает Messenger с Handler, а Fragment отправляет сообщения через Messenger.

  3. Через Callback Interface
    Сервис реализует интерфейс, который передается из Fragment при запуске сервиса.

  4. Через SharedPreferences/DB
    Сервис записывает данные в SharedPreferences или БД, а Fragment читает их.

Выбор зависит от сложности данных и требований к производительности.