← Назад к вопросам

Какие знаешь сервисы в Android?

1.6 Junior🔥 171 комментариев
#State Management#Архитектура Flutter

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сервисы в Android: полный справочник

Service — компонент Android приложения, работающий в фоне без пользовательского интерфейса. Используется для долгоживущих операций: загрузка файлов, воспроизведение музыки, отслеживание GPS, синхронизация данных.

Основные типы сервисов

1. Foreground Service (Сервис переднего плана)

Foreground Service выполняется с видимым уведомлением и имеет высокий приоритет. Android редко его убивает.

// AndroidManifest.xml
<manifest>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <application>
        <service
            android:name=".MusicService"
            android:foregroundServiceType="mediaPlayback" />
    </application>
</manifest>

// MusicService.kt
class MusicService : Service() {
    private val notificationManager by lazy {
        getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // Создаём уведомление
        val notification = NotificationCompat.Builder(this, "music_channel")
            .setContentTitle("Музыка играет")
            .setContentText("Нажмите чтобы вернуться")
            .setSmallIcon(R.drawable.ic_music)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .build()

        // Запускаем сервис как foreground с уведомлением
        startForeground(1, notification)

        // Начинаем воспроизведение
        playMusic()

        return START_STICKY // Перезапускать если убит
    }

    private fun playMusic() {
        // Логика воспроизведения
    }

    override fun onBind(intent: Intent?): IBinder? = null
}

// Запуск из Activity/Fragment
val serviceIntent = Intent(context, MusicService::class.java)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    context.startForegroundService(serviceIntent)
} else {
    context.startService(serviceIntent)
}

Когда использовать:

  • Воспроизведение музыки/подкастов
  • Загрузка больших файлов
  • Навигация/GPS отслеживание
  • Видеоконференции

2. Background Service (Фоновый сервис)

Background Service работает в фоне без уведомления. Android может его убить когда памяти не хватает.

class DataSyncService : Service() {
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // Синхронизация данных с сервером
        Thread {
            syncDataWithServer()
        }.start()

        return START_REDELIVER_INTENT // Переотправить intent если убит
    }

    private fun syncDataWithServer() {
        try {
            val response = api.syncData()
            // Сохраняем результат
        } catch (e: Exception) {
            // Логируем ошибку
        }
    }

    override fun onBind(intent: Intent?): IBinder? = null
}

// Запуск
val intent = Intent(context, DataSyncService::class.java)
context.startService(intent)

Проблема: Background Service может быть убит в любой момент (особенно на Android 8+)

3. Bound Service (Связанный сервис)

Bound Service позволяет Activity/Fragment взаимодействовать с сервисом через IBinder.

class LocalMusicService : Service() {
    private var isPlaying = false
    private val binder = LocalBinder()

    // Binder для взаимодействия с клиентом
    inner class LocalBinder : Binder() {
        fun getService(): LocalMusicService = this@LocalMusicService
    }

    override fun onBind(intent: Intent?): IBinder = binder

    fun play() {
        isPlaying = true
        // Воспроизведение
    }

    fun pause() {
        isPlaying = false
        // Пауза
    }

    fun getCurrentPosition(): Int = 0 // Текущая позиция трека
}

// Activity
class PlayerActivity : AppCompatActivity() {
    private var service: LocalMusicService? = null
    private var bound = false

    private val connection = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, binder: IBinder?) {
            val localBinder = binder as LocalMusicService.LocalBinder
            service = localBinder.getService()
            bound = true
        }

        override fun onServiceDisconnected(name: ComponentName?) {
            bound = false
        }
    }

    override fun onStart() {
        super.onStart()
        val intent = Intent(this, LocalMusicService::class.java)
        bindService(intent, connection, Context.BIND_AUTO_CREATE)
    }

    override fun onStop() {
        super.onStop()
        if (bound) {
            unbindService(connection)
            bound = false
        }
    }

    fun playMusic() {
        service?.play()
    }

    fun pauseMusic() {
        service?.pause()
    }
}

Когда использовать:

  • Взаимодействие между Activity и Service
  • Получение данных от сервиса
  • Контроль сервиса из UI

4. IntentService (устаревший)

IntentService был удобен для выполнения одной задачи в фоне, но устарел.

// СТАРЫЙ ПОДХОД (не используй!)
class UploadIntentService : IntentService("Upload") {
    override fun onHandleIntent(intent: Intent?) {
        val fileUri = intent?.getParcelableExtra<Uri>("file_uri")
        uploadFile(fileUri)
    }

    private fun uploadFile(uri: Uri?) {
        // Загрузка файла
    }
}

// НОВЫЙ ПОДХОД (используй!)
class UploadWorker(appContext: Context, params: WorkerParameters) :
    CoroutineWorker(appContext, params) {
    override suspend fun doWork(): Result {
        return try {
            val fileUri = inputData.getString("file_uri")
            uploadFile(fileUri)
            Result.success()
        } catch (e: Exception) {
            Result.retry()
        }
    }
}

5. Служба жизненного цикла (Lifecycle Service)

Android современная рекомендация: используй WorkManager для фоновых задач.

class DataSyncWorker(appContext: Context, params: WorkerParameters) :
    CoroutineWorker(appContext, params) {

    override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
        return@withContext try {
            // Синхронизация данных
            val data = api.fetchData()
            database.insertData(data)
            Result.success()
        } catch (e: Exception) {
            if (runAttemptCount < 3) {
                Result.retry()
            } else {
                Result.failure()
            }
        }
    }
}

// Запуск периодической работы
val syncWork = PeriodicWorkRequest.Builder(
    DataSyncWorker::class.java,
    15, TimeUnit.MINUTES
).build()

WorkManager.getInstance(context).enqueueUniquePeriodicWork(
    "data_sync",
    ExistingPeriodicWorkPolicy.KEEP,
    syncWork
)

Сравнение типов сервисов

ТипУведомлениеПриоритетВзаимодействиеИспользование
ForegroundДаВысокийНетМузыка, GPS, файлы
BackgroundНетНизкийНетСинхронизация (устаревший)
BoundНетСреднийДаЛокальное взаимодействие
WorkManagerОпциональноВысокийWorkSpecЗадачи (современный)

Жизненный цикл Service

Started Service:
┌──────────────────┐
│   onCreate()     │ (один раз)
├──────────────────┤
│  onStartCommand()│ (при каждом startService)
├──────────────────┤
│   onDestroy()    │ (при stopService)
└──────────────────┘

Bound Service:
┌──────────────────┐
│   onCreate()     │ (один раз)
├──────────────────┤
│   onBind()       │ (при bindService)
├──────────────────┤
│  onUnbind()      │ (при unbindService)
├──────────────────┤
│   onDestroy()    │ (при последнем unbind)
└──────────────────┘

Рекомендации от Google

НЕ используй:

  • ❌ Service для долгих операций (запросы, обработка)
  • ❌ Background Service (может быть убит)
  • ❌ IntentService (устарел)

Используй:

  • WorkManager — для отложенных и периодических работ
  • Foreground Service — для видимых операций (музыка, GPS)
  • Bound Service — для локального взаимодействия
  • Coroutines — для асинхронных операций в Activity/Fragment
  • JobScheduler — для планирования системных задач

Интеграция с Flutter

// Запуск Android сервиса из Flutter
import 'package:android_intent_plus/android_intent.dart';

void startMusicService() {
  const platform = MethodChannel('com.example.app/service');
  try {
    platform.invokeMethod('startMusicService');
  } catch (e) {
    print('Failed to start service: $e');
  }
}

// Или через native code в Android:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  const platform = MethodChannel('com.example.app/service');
  platform.setMethodCallHandler((call) async {
    if (call.method == 'updateProgress') {
      final progress = call.arguments as int;
      // Обновить UI в Flutter
    }
  });
  
  runApp(MyApp());
}

Вывод

Для Flutter разработчика важно знать:

  1. Foreground Service — видимые долгие операции
  2. Bound Service — взаимодействие с native кодом
  3. WorkManager — фоновые и периодические задачи
  4. Как запускать сервис из Flutter — через MethodChannel
  5. Permissions — нужны для сервисов (AndroidManifest.xml)

Андроид сервисы мощный инструмент, но их нужно использовать правильно согласно современным best practices.

Какие знаешь сервисы в Android? | PrepBro